簡體   English   中英

bash:&&運算符行為

[英]bash: && operator behaviour

我正在練習bash腳本,並對&&運算符有疑問

根據O'reily bash cookbook,如果&&運算符之前的命令失敗,那么它之前的命令應該停止執行

見下面的代碼

-bash-4.2$ pwd
/home/postgres
-bash-4.2$ mkdir testdir
-bash-4.2$ dir=testdir1
-bash-4.2$ cd $dir1 && rm -rf *
-bash-4.2$ echo $?
0
-bash-4.2$ ls

我希望rm -rf命令失敗,因為命令cd testdir1失敗,但是rm -rf執行並清理。 行為更像是“;” 運營商。

請有人解釋一下,我錯過了什么

該問題與退出代碼有關。

如果第一個命令指示它成功,則&&運算符將執行第二個命令。

考慮以下:

gmc@linux-ihon:/tmp> rm -rf nonexistant
gmc@linux-ihon:/tmp> echo $?     # Note that there is no error message and the exit status is 0 (success).
0
gmc@linux-ihon:/tmp> rm -r nonexistant
rm: cannot remove 'nonexistant': No such file or directory
gmc@linux-ihon:/tmp> echo $?     # Note that there was an error message and the exit status is 1 (unsuccessful)
1
gmc@linux-ihon:/tmp> 

所以現在考慮以下內容:

gmc@linux-ihon:/tmp> rm -rf nonexistant && echo "rm success"
rm success
gmc@linux-ihon:/tmp> rm -r nonexistant && echo "rm success"
rm: cannot remove 'nonexistant': No such file or directory
gmc@linux-ihon:/tmp> 

在這種情況下,因為非耐用目錄的rm -rf被認為是成功的,所以執行下一個命令。 而同一目錄的rm -r被視為失敗,因此不執行下一個命令。

我不確定為什么當目錄不存在時rm -f會返回成功,有一種想法是,如果目錄不存在,那么你已經實現了rm命令的預期結果,因此成功! 而沒有-f選項,你明確要求rm刪除一些東西,如果它不存在,請告訴我!

BTW。 您發布的代碼中可能存在錯誤。

您將“壞”目錄分配給變量dir dir=testdir1 但你cd $dir1 ,這相當於沒有參數的cd (因為變量dir1不存在)。 因此,它將cd回到您的主目錄(返回值:成功)。 從那里運行rm -rf *可能不是最好的主意。

命令失敗意味着退出代碼與0不同。

如果命令應該失敗,因為未定義變量,則可以使用set -o nounsetset -u

set -u
cd "$dir1"
echo "$?"

set +u   # disable nounset
cd "$dir1"
echo "$?"

檢查文檔或實現中的退出代碼。

來自man bash / cd

cd [-L | [-P [-e]] [ - @]] [dir]

將當前目錄更改為dir。 如果未提供dir,則HOME shell變量的值是默認值 dir之后的任何其他參數都將被忽略。 變量CDPATH

定義包含dir的目錄的搜索路徑:在CDPATH中搜索dir的每個目錄名稱。 CDPATH中的備用目錄名用冒號(:)分隔。 CDPATH中的空目錄名與當前目錄相同,即“。” 如果dir以斜杠(/)開頭,則不使用CDPATH。 -P選項使cd使用物理目錄結構

在遍歷dir時和在dir中處理..的實例之前解析符號鏈接(另請參閱set builtin命令的-P選項); -L選項強制遵循符號鏈接

通過在處理dir中的實例后解析鏈接。 如果..出現在目錄中,則通過從dir中刪除前一個路徑名組件,返回斜杠或者來處理它

dir的開頭。 如果-e選項與-P一起提供,並且在成功更改目錄后無法成功確定當前工作目錄,則cd將返回不成功

狀態。 在支持它的系統上, - @選項將與文件關聯的擴展屬性顯示為目錄。 在目錄更改之前, - 的參數將轉換為$ OLDPWD

嘗試。 如果使用CDPATH中的非空目錄名,或者 - 是第一個參數,並且目錄更改成功,則寫入新工作目錄的絕對路徑名

到標准輸出。 如果目錄已成功更改,則返回值為true; 否則是假的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM