Bash
我可以使 cd 成為函式的本地函式嗎?
是否可以製作類似的功能
function doStuffAt { cd $1 # do stuff }
但是讓它如此呼叫該函式實際上並沒有改變我的密碼,它只是在函式的持續時間內改變它?我知道我可以保存密碼並在最後將其設置回來,但我希望有一種方法可以讓它在本地發生而不必擔心。
是的。
( )
只需讓函式在子shell而不是組命令中執行它的{ }
命令:doStuffAt() ( cd -- "$1" || exit # the subshell if cd failed. # do stuff )
括號 (
( )
) 打開一個新的子外殼,它將繼承其父級的環境。子shell 將在執行它的命令完成後立即退出,將您返回到父shell,並且cd
只會影響子shell,因此您的PWD 將保持不變。請注意,子shell 還將複製所有shell 變數,因此您不能通過全域變數將資訊從子shell 函式傳遞回主腳本。
有關子外殼的更多資訊,請查看
man bash
:(列表)
list 在子shell 環境中執行(參見下面的命令執行環境)。影響 shell 環境的變數分配和內置命令在命令完成後不會保持有效。返回狀態是列表的退出狀態。
相比於:
{ 列表; }
list 只是在目前的 shell 環境中執行。list 必須以換行符或分號結束。這稱為組命令。返回狀態是列表的退出狀態。請注意,與元字元 ( 和 ) 不同,{ 和 } 是保留字,並且必須出現在允許辨識保留字的地方。由於它們不會導致斷字,因此必須用空格或其他 shell 元字元將它們與列表隔開。