DD-WRTルーター用に作成されたbashスクリプトがあります。これは、NASデーモンを定期的に再起動して、iPhoneのワイヤレス接続に関するランダムな問題を修正します。
これは私の最初のbashスクリプトの1つであり、この問題の原因を特定する方法を理解しようとして迷っています。
スクリプトは実行され、想定どおりにサービスが再起動されます。ただし、eval: line 1: $: not found
スクリプトの実行時にターミナルで次のエラーが発生します。
#!/bin/sh
##
# Restarts the nas daemon on the specified interval
##
# Restart interval, in seconds
#T=3600 # hourly
T=60 # for testing
# Log file
if [ $# -ne 0 ]; then
log=$1
else
log=/tmp/restart.log
fi
while [ true ]; do
# Wait
sleep $T
# Find commands to relaunch all nas daemons
nascmd=`ps ww | grep nas | awk '{if($5!="grep"){$1=$2=$3=$4=""; print $0";"}}'`
echo [`date`] Existing pid: `ps | grep nas | awk '{ORS=",";if($5!="grep"){print $1}}'` >> $log
# Restart nas with original arguments
killall -HUP nas
echo [`date`] Running command: $nascmd >> $log
# Strip special characters prior to eval
safecmd=`echo $nascmd | sed 's/\$/\\$/g'`
eval $safecmd
echo [`date`] Finished, new pid: `ps | grep nas | awk '{ORS=",";if($5!="grep"){print $1}}'` >> $log
done
eval
ちょうど1行の長さなので、エラーの原因だと思います。私はそれが何で$
あり、なぜそれが見つからないのかを理解しようとしています。ドル記号が存在する場合は、すべてエスケープします。あるべきではありませんが、誰かが暗号化パスフレーズをドル記号の付いたものに変更した場合に備えて、私は安全でした。