Как передать аргументы сценария, содержащие кавычки / пробелы?

Я пытаюсь написать сценарий notify-finish , который можно добавить к любой команде. Когда это будет сделано, он выполнит команду, заданную следующими аргументами, а затем отправит пользователю электронное письмо, когда команда будет завершена. Вот что у меня:

PROG=$1
# Run command given by arguments
$@
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/ user@remote:dest/

Неудачный пример:

notify-finished rsync -avz -e 'ssh -c blowfish' source/ user@remote:dest/

Во втором случае $ @ расширяется до rsync -avz -e ssh -c blowfish source user @ remote: dest / , без одинарных кавычек. Он не работает ни с двойными кавычками, ни с $ * .

После прочтения других сообщений я попытался поместить команду в массив, но у меня возникла точно такая же проблема:

CMD=(notify-finished rsync -avz -e 'ssh -c blowfish' source/ user@remote:dest/)
${CMD[@]}

Как сделать Я выполняю эту работу для всех аргументов?

23
задан that other guy 7 June 2018 в 22:57
поделиться