コマンドを変数に入れないでください。引用符は思ったとおりに機能しません(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