0

我试图运行以下脚本来修改 Growl plist 中的时间戳,但该脚本无法更新 plist。如果我从命令行执行相同的操作,那么它工作正常。

请帮忙。

#!/bin/sh
current=`date +"%Y-%m-%d %l:%M:%S +0000"`
cmd="defaults read com.Growl.GrowlHelperApp LastUpdateCheck -date '$current'"
echo $cmd
`$cmd`
echo `defaults read com.Growl.GrowlHelperApp LastUpdateCheck`
4

1 回答 1

2

不要将命令放入变量中,引用不会像您认为的那样工作(请参阅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
于 2012-04-14T15:32:08.380 回答