2011-01-07 1019 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的原因是因爲命令只有在匹配時纔會生成輸出,大多數情況下(當然)沒有,但是如果有的話,您不會有興趣看到結果。