Подтвердить что ты не робот

Bash аргумент, передаваемый дочернему элементу ($ @или $*)

Я пытаюсь написать 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/, без одинарных кавычек. Он также не работает с двойными кавычками.

4b9b3361

Ответ 1

Использование:

$PROG "[email protected]"

Он перенесет каждый аргумент в "".

Ответ 2

Поместите двойные кавычки вокруг ваших подстановок переменных, чтобы они не обрабатывались (обратите внимание, что это относится ко всем переменным: [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"

Ответ 3

Ваш 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/"