为什么反引用包含kill的shell命令会改变它的行为?

时间:2014-12-15 21:27:45

标签: shell

我正在尝试在shell命令上添加超时。具体来说,在nmblookup上。因为在我的LAN上支持此查询的设备非常快,我想在通话时添加1秒的超时。所以我没有浪费时间与其他设备

在shell脚本中使用以下调用非常正常(尝试使用虚拟$ IP):

(nmblookup -A $IP | grep '#00' | grep -v GROUP | awk '{print $1}') & WPID=$!; sleep 1 && kill $WPID > /dev/null 2>&1 & wait $WPID

然而,由于我想要捕获输出,我反过来引用这个调用..这样做,kill似乎没有被执行(在正确的进程上?)...

Host=`(nmblookup -A $IP | grep '#00' | grep -v GROUP | awk '{print $1}') & WPID=$!; sleep 1 && kill $WPID > /dev/null 2>&1 & wait $WPID`

知道在上面的调用中可以更改哪些内容也可以在反引号中工作?

对于任何提示都很有帮助!!!

PS:实际上,我想在php脚本中使用这个调用...所以我无法逃避使用反引号...(我认为)。否则,这将是一个选项:

(nmblookup -A $IP | grep '#00' | grep -v GROUP | awk '{print $1}' > "$BASEDIR/hostname") & WPID=$!; sleep 1 && kill $WPID > /dev/null 2>&1 & wait $WPID
read -r Host < "$BASEDIR/hostname"

PPS:我也试过这种方法而没有取得进一步的成功:

BASEDIR=$(dirname $0)
echo "(nmblookup -A $IP | grep '#00' | grep -v GROUP | awk '{print $1}') & WPID=\$!; sleep 1 && kill \$WPID > /dev/null 2>&1 & wait \$WPID" > "$BASEDIR/execlimit"
chmod 775 "$BASEDIR/execlimit"
Host=`$BASEDIR/execlimit`

请注意,在没有反引号的情况下调用execlimit工作正常...它只能在反引号内调用时终止命令...所以,我不相信问题是逃避$符号......

2 个答案:

答案 0 :(得分:1)

参数扩展全部在命令替换实际运行之前执行。只需转义美元符号,就可以保留它们,直到命令执行命令为止。

Host=$( (nmblookup -A $IP | grep '#00' | grep -v GROUP | awk '{print $1}') &
         WPID=\$!; sleep 1 && kill \$WPID > /dev/null 2>&1 & wait \$WPID)

答案 1 :(得分:0)

好吧,问题似乎是当我反向调用时在WPID中捕获了PID(我确实在它旁边添加了对'ps'的调用并且它不是预期的PID ...)

因此我改写了我的调用以确保PID被杀死(它现在可以从我的php脚本中正常工作):

`nmblookup -A $IP > ./hostname & WPID=\$!; sleep 1 && kill \$WPID > /dev/null 2>&1 & wait \$WPID`;
$host = `grep '#00' ./hostname | grep -v GROUP | awk '{print $1}'`;
`rm -f ./hostname`;

在php中,$ sign引用变量,因此,它们必须被转义为按原样(作为文本)传递给shell(否则,php会将它们替换为“它们的值”)