Я пишу спецификации файла, в котором я хочу разместить скрипт для запуска процесса из каталога init.d. Вот это часть файла SPEC:

%prep   

%{__cat} <<EOF  > myapp.run


prog="IMG APP BACKEND"
exec=%{APP_prefix}/bin/myapp.%{_APP}
config=%{APP_prefix}/etc/myapp%{_APP}.xml                                  

. /etc/rc.d/init.d/functions                                                  

start() {
        if [ $UID -ne 0 || $UID -ne 80 ]; then
                echo "User has insufficient privilege."                       
                exit 4                                                        
        fi
        [ -x $exec ] || exit 5
        [ -f $config ] || exit 6
        echo -n $"Starting $prog: "
        daemon $exec $config && success || failure                            
        retval=$?                                                             
        echo
        [ $retval -eq 0 ] && touch $lockfile                                  
        return $retval                                                        
}

когда я открываю myapp.run, я получаю (ту же часть):

start() {
        if [ 1031 -ne 0 || 1031 -ne 80 ]; then
                echo "User has insufficient privilege." 
                exit 4
        fi
        [ -x  ] || exit 5
        [ -f  ] || exit 6
        echo -n $"Starting : "
        daemon   && success || failure
        retval=0
        echo
        [  -eq 0 ] && touch
        return
}

Что я делаю не так? Почему переменная UID получает 1031 и так далее?

спасибо за все ответы

1 ответ1

0

Вы используете heredoc с <<EOF . В оболочках 'sh'/bash (как и в большинстве других языков программирования) переменные внутри heredoc раскрываются во время выполнения так же, как в строках с двойными кавычками. Например, $UID расширяется до идентификатора пользователя, который запускает файл спецификации, а $exec раскрывается до пустой строки, поскольку она еще не установлена.

$ cat <<EOF
> I am $USER
> EOF
I am grawity

Чтобы избежать этого, поместите строку ограничения в одинарные кавычки: <<'EOF'

$ cat <<'EOF'
> I am $USER
> EOF
I am $USER

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .