Экранирование переменных в файле bash

#linux #bash #shell #init

#linux #bash #оболочка #инициализация

Вопрос:

Я создаю скрипт init.d в файле bash, который выглядит следующим образом:

 # AUTOSTART
$APPDIR=somedir
$APPCONF=somedir
$APPVENV=somedir
$APPUSER=someuser
cat <<EOF >/etc/init.d/uwsgi
#!/bin/bash
daemon=$APPVENV/bin/uwsgi
args="--emperor $APPCONF/uwsgi/app.ini --daemonize /var/log/emperor.log --emperor-pidfile $APPDIR/emperor.pid --gid `id -g $APPUSER`"
pid=$APPDIR/emperor.pid
case "$1" in
    start)
        echo "Starting uwsgi"
        start-stop-daemon -m -p $pid --start --exec $daemon $args
        ;;
    stop)
        echo "Stopping script uwsgi"
        start-stop-daemon --signal INT -p $pid --stop $daemon $args
        ;;
    reload)
        echo "Reloading conf"
        kill -HUP $(cat $pid)
        ;;
    *)
        echo "Usage: /etc/init.d/uwsgi {start|stop|reload}"
        exit 1
    ;;
esac
exit 0
EOF
  

Насколько я понимаю из справки, $ APPCONF, $ APPVENV, $APPUSER и $ APPDIR необходимо экранировать, потому что я определяю их вне файла. Так правильно ли, что я просто ставлю косую черту перед переменной следующим образом:

 daemon=$APPVENV/bin/uwsgi
args="--emperor $APPCONF/uwsgi/app.ini --daemonize /var/log/emperor.log --emperor-pidfile $APPDIR/emperor.pid --gid `id -g $APPUSER`"
pid=$APPDIR/emperor.pid
  

Похоже, что это все еще не работает, служба не запускается, поэтому я думаю, что, возможно, я сделал что-то еще неправильно. Кто-нибудь может подтвердить, что я правильно экранирую, пожалуйста?

Комментарии:

1. Вы не назначаете имена переменных, используя $ перед ними в оболочке.

Ответ №1:

Знак доллара используется только для чтения / использования значения переменной, а не при установке ее значения. Таким образом, установка APPDIR в somedir будет выглядеть следующим образом:

 APPDIR=somedir
  

В зависимости от того, как вы вызываете скрипт, вы также можете захотеть экспортировать переменную:

 export APPDIR=somedir
  

Комментарии:

1. Ах, хорошо, спасибо. Но как насчет остальной части моего экранирования, это правильно?

2. Просто взглянув на это, я не вижу ничего другого, что могло бы вызвать проблемы.

3. Экранируйте только $ , если вы хотите , чтобы буквальный знак доллара отображался в /etc/init.d/uwsgi , а не в значении $APPDIR и т. Д. Я подозреваю, что вы не хотите экранировать $ , хотя, поскольку вы присваиваете значения переменным перед записью файла.

4. Вы хотите экранировать $ for $daemon , $pid , и $args , хотя, поскольку это значения, установленные внутри скрипта, который вы записываете на диск.

5. @chepner прав. Я немного неправильно понял вопрос.