不要将命令放入变量中,引用不会像您认为的那样工作(请参阅BashFAQ #050:我正在尝试将命令放入变量中,但复杂的情况总是失败!)。(顺便说一句,echo $cmd
并没有告诉您实际将执行什么命令)。直接运行命令即可。
另外,我认为您正在尝试运行defaults write ...
,而不是defaults read ...
. 最后,最后一行的回显和反引号有效地相互抵消——只需将两者都删除即可。这是我得到的:
#!/bin/sh
current=$(date +"%Y-%m-%d %l:%M:%S +0000")
defaults write com.Growl.GrowlHelperApp LastUpdateCheck -date "$current"
printf "New value of LastUpdateCheck: "
defaults read com.Growl.GrowlHelperApp LastUpdateCheck
如果由于某种原因,您确实需要在执行命令之前将命令存储在变量中,请使用数组。但请注意,这是仅限 bash 的功能,因此请使用以下命令启动脚本#!/bin/bash
:
#!/bin/bash
current=$(date +"%Y-%m-%d %l:%M:%S +0000")
cmd=(defaults write com.Growl.GrowlHelperApp LastUpdateCheck -date "$current")
printf "About to execute:"
printf " %q" "${cmd[@]}" # Need to use printf trickery to get appropriate quoting
printf "\n"
"${cmd[@]}"
printf "New value of LastUpdateCheck: "
defaults read com.Growl.GrowlHelperApp LastUpdateCheck