2013-11-26 25 views
0

我有一段時間後會運行這個腳本,但我真的不明白它是如何工作的。我現在的理解是,如果命令失敗,它會迴應stderr中的某些內容。但我試過「command -v lftp>/dev/null 2> & 1」,即使安裝了lftp,它也不會輸出。有人能解釋我這條線究竟做了什麼嗎?這個命令的含義:command -v lftp>/dev/null 2>&1

# check lftp is installed 
command -v lftp >/dev/null 2>&1 || { echo >&2 "lftp is required. Please install it.  Aborting."; exit 1; } 
+1

如果您想查看命令的輸出內容,則必須刪除任何'>/dev/null 2>&1',因爲它隱藏了該命令的輸出內容。 –

+0

哦,非常感謝!但我想先了解腳本的工作原理,而不是讓它變得更好...... – PerrierCitror

+0

我不告訴你如何使腳本更好!你想看看輸出,我告訴你如何看待輸出! –

回答

1

它查找lftp對PATH和扔掉它找到的位置,和/或任何錯誤(但它們發送到/dev/null,這就好比一個黑洞 - 數據進入它,從來都沒有離開它) 。

然後,如果找不到它,它將顯示錯誤消息並退出腳本,退出代碼爲1

+0

好吧,他爲什麼重定向stderr? ||否則無法工作? – PerrierCitror

+0

不,這是爲了避免用戶輸入不相關的額外錯誤消息。 –

+0

嗯,我不明白你的意思。如何重定向到標準輸出避免混淆用戶? – PerrierCitror

1

>/dev/null將命令的標準輸出(文件描述符1)發送到空設備(這將拋出所有輸出),然後2將文件描述符2(標準錯誤)附加到與文件描述符1(它是空設備)相同的地方。

這只是丟棄所有輸出的標準方式。下面將有同樣的效果:

... 2> /dev/null 1>&2 

注意順序很重要,因爲:

2>&1 > /dev/null 

不會有同樣的效果;您會放棄標準輸出,但會將標準錯誤附加到標準輸出的文件描述符。

知道的事情有助於使這一切的感覺是,默認情況下在Unix系統中的程序有三個文件描述符打開啓動: 0 =標準(標準輸入或者,在C++中,CIN) 1 =標準輸出(標準輸出,或在C++中,cout) 2 =標準錯誤(標準錯誤(stderr或C++,cerr)

+0

謝謝你,它使得它更清晰,我不知道區別:) – PerrierCitror

1

command -v是POSIX標準的方式來找出shell將執行命令。如果參數與可執行文件相對應,它將打印出路徑,並以成功狀態退出。如果參數不是shell可以執行的參數,它將會以失敗退出。

由於用戶不感興趣的任何command -v打印,標準輸出和標準錯誤將被重定向到/dev/null,這是第一個重定向標準輸出做/dev/null,然後標準輸出複製到標準錯誤:>/dev/null 2>&1

之後,如果由command -v完成的查找失敗,將執行一個列表(包含在{}中)。這是通過||完成的,您可以將其讀取爲左側部分成功或執行右側部分

(這是如果command -v無法執行)的列表輸出診斷消息到標準錯誤,然後退出失敗的腳本:

>&2重複的標準錯誤到標準輸出,現在你寫入stdout一切都會去了最初只是stderr。 exit 1退出失敗狀態。殼使用0退出狀態成功,而不是0失敗。

+0

OP應該選擇了這個答案。 – chb