我正在尝试编写一个名为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[@]}
如何使此代码适用于所有参数?
$@
的特殊行为。 - glenn jackman$@
分配给了ARGS
,就像ARGS=$@
,然后执行$PROG $ARGS
,所以这不会起作用。谢谢。 - axonARGS=("$@"); "$PROG" "${ARGS[@]}"
- Gordon Davisson