2011-01-07 77 views
0

我正在学习使用名为Beginning Linux Programming(4th ed)的书从最基本的shell编程。我对这个剧本有疑惑的until -clause:

#!/bin/bash 

until who | grep "$1" > /dev/null 
do 
    sleep 60 
done 

# Now ring the bell and announce the unexpected user. 

echo -e '\a' 
echo "***** $1 has just logged in *****" 

exit 0 

我的疑问是什么who | grep "$1" > /dev/null用于这里?为什么重定向grep输出到/dev/null

回答

5

正如您所提到的那样,'until'循环用于测试条件,并且将运行所有'do | done'块,直到条件成立为止。换句话说,当条件存在为FALSE时,它只执行代码块,并运行它直到它变为真。您正在测试的脚本对于捕获您作为参数传递给脚本的登录用户非常有用(因此,grep“$ 1”,$ 1是位置参数)。它会休眠一分钟(睡眠60),直到用户登录系统,然后它将退出循环,并执行所有'$ 1刚登录'的东西。将grep输出重定向到/ dev/null用于不显示grep命令的输出(您可以使用grep -q“$ 1”,这将实现相同的效果)。

希望澄清你的疑惑。

+0

@mguilech:谢谢。直到出现命令“who | grep $ 1>/dev/null”的返回代码,才测试条件?我对吗 ? – Tracy 2011-01-08 05:50:19

+0

特蕾西,没错,直到评估整个命令的返回值(重定向到/ dev/null并不重要,直到)。返回值必须为FALSE才能让其处理,一旦成立,直到退出。 – mguillech 2011-01-10 15:02:31

0

whileuntil(和,诚然,if)看测试的退出代码,而不是在可以或可以不被在stdout(或标准错误)产生的任何文本。

我怀疑之所以使用重定向到/ dev/null的原因是因为命令只有在匹配时才会生成输出,大多数情况下(当然)没有,但是如果有的话,您不会有兴趣看到结果。