#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 прав. Я немного неправильно понял вопрос.