假設我們有這樣的腳本。爲什麼在設置-e時設置了bash腳本,並且由&&連接了兩個管道失敗
#!/bin/bash
set -e
ls notexist && ls notexist
echo still here
不會因爲一套-e
但
#!/bin/bash
set -e
ls notexist || ls notexist
echo still here
意願的出口。 爲什麼?
假設我們有這樣的腳本。爲什麼在設置-e時設置了bash腳本,並且由&&連接了兩個管道失敗
#!/bin/bash
set -e
ls notexist && ls notexist
echo still here
不會因爲一套-e
但
#!/bin/bash
set -e
ls notexist || ls notexist
echo still here
意願的出口。 爲什麼?
bash的手冊set -e
說:
The shell does not exit if the command that fails is [...]
part of any command executed in a && or || list except the
command following the final && or ||
儀表手冊說:
If not interactive, exit immediately if any untested command fails.
The exit status of a command is considered to be explicitly tested
if the command is used to control an if, elif, while, or until;
or if the command is the left hand operand of an 「&&」 or 「||」 operator.
爲和測試,外殼將提前停止的「左測試期間手操作數「。 因爲還有測試,它會認爲整個命令是「測試」,因此不會中止。
爲OR測試,外殼具有運行所有(兩者)測試,一旦最後一次測試失敗,它會認爲出現了一個未經檢查的錯誤,因此將中止。
我同意這有點違反直覺。
因爲作爲擊手冊說關於set -e
:
殼做如果失敗的命令是立即同時或直到關鍵字,測試 的一部分,下面以下命令 列表的一部分不會退出if或elif保留字,在 & &或||中執行的任何命令的一部分。除了最後的命令& &或||,任何命令 在一個管道中,但最後一個,或者命令的返回值是 與!
ls notexist || ls notexist
命令終止shell,因爲第二個(最後一個)ls notexist
退出失敗。 ls notexist && ls notexist
不終止外殼,因爲執行「& &列表」在第一個ls notexist
失敗並且第二個(最後一個)永遠不會到達後停止。
順便說一句,使用true
和false
代替ls notexist
等特定命令,可以更輕鬆,更可靠地進行這樣的測試。
我喜歡破折號的解釋,謝謝你的發佈! – spbnick
很好的解釋,謝謝 – dspjm