我有一个为我们的 DD-WRT 路由器编写的 bash 脚本,它会定期重新启动 NAS 守护程序以修复 iPhone 连接到无线的随机问题。
这是我的第一个 bash 脚本之一,我在试图找出如何确定这个问题的根源时迷失了方向。
该脚本会运行,并且会按预期重新启动服务。但是,我收到错误消息: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 行长。我试图弄清楚$
它是什么以及为什么找不到它。我会避开所有的美元符号,如果它们存在的话。不应该有,但是,我只是为了安全,以防有人将加密密码短语更改为带有美元符号的东西。