Bash

我可以使 cd 成為函式的本地函式嗎?

  • December 28, 2020

是否可以製作類似的功能

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 元字元將它們與列表隔開。

引用自:https://unix.stackexchange.com/questions/612611