Ответ 1
Использование:
$PROG "[email protected]"
Он перенесет каждый аргумент в "".
Я пытаюсь написать script, который может быть добавлен к любой команде. Когда это будет сделано, он выполнит команду, заданную приведенными ниже аргументами, а затем отправьте сообщение пользователю по электронной почте, когда команда будет завершена.
$PROG=$1
// Run program below
$PROG [email protected]
ECODE=$?
echo -e 'Subject: `hostname`: $PROG finished\r\nTo: <$USER>\r\n\r\nExited with $ECODE\r\n' | sendmail $USER
Это работает большую часть времени, но когда цитирование присутствует в аргументах команды для запуска, они удаляются. Пример:
Работает:
# notify-finished rsync -avz source/ [email protected]:dest/
Не работает:
# notify-finished rsync -avz -e 'ssh -c blowfish' source/ [email protected]:dest/
Во втором случае [email protected]
раскрывается до rsync -avz -e ssh -c blowfish source [email protected]:dest/
, без одинарных кавычек. Он также не работает с двойными кавычками.
Использование:
$PROG "[email protected]"
Он перенесет каждый аргумент в "".
Поместите двойные кавычки вокруг ваших подстановок переменных, чтобы они не обрабатывались (обратите внимание, что это относится ко всем переменным: [email protected]
, $1
и $PROG
). Кроме того: не присваивайте ему значение $перед именем переменной; используйте #
для комментариев; и в последней строке одиночные кавычки не будут заменять переменные вообще.
PROG="$1"
shift
# Run program below
"$PROG" "[email protected]"
ECODE=$? # note: this will always be a number, so it doesn't have to be protected with double-quotes
echo -e "Subject: $(hostname): $PROG finished\r\nTo: <$USER>\r\n\r\nExited with $ECODE\r\n' | sendmail "$USER"
Ваш script должен выглядеть следующим образом:
# Run program below
PROG="[email protected]"
${PROG}
ECODE=$?
echo -e "Subject: $(hostname): ${PROG} finished\r\nTo: <$USER>\r\n\r\nExited with $ECODE\r\n"
Конечная команда echo требует двойных кавычек вместо одиночной кавычки '
для интерпретации и расширения переменных $
.
И вы должны включать аргумент командной строки в двойные кавычки так же, как это:
notify-finished "rsync -avz -e 'ssh -c blowfish' source/ [email protected]:dest/"