為什麼我必須使用此命令兩次才能執行它?
我做了一個別名
alias goto="cd $@ && source ~/.zshrc"
,它可以工作,但前提是我執行了兩次。即使我在一個 shell 中執行了兩次,如果我想移動到另一個目錄,我也必須再次執行兩次。為什麼會這樣,我該如何改變呢?我需要輸入兩次
goto <dir>
。第一次,我還在正常的目錄中,第二次,我到達了目的地。我需要獲取 .zshrc,因為我檢查了路徑:CURRENT=$PWD AT_HOME=0 AT_ROOT=0 if [ $PWD = $HOME ]; then AT_HOME=1 elif [ $PWD = / ]; then AT_ROOT=1 else cd ../ if [ $PWD = $HOME ]; then AT_HOME=1 elif [ $PWD = / ]; then AT_ROOT=1 else cd ../ if [ $PWD = $HOME ]; then AT_HOME=1 elif [ $PWD = / ]; then AT_ROOT=1 fi fi fi cd $CURRENT if [ $AT_HOME = 0 ]; then if [ $AT_ROOT = 0 ]; then ZSH_THEME="prompt-basename" else ZSH_THEME="prompt-normal" fi else ZSH_THEME="prompt-normal" fi
它給了我完整的路徑(即使在 /usr/lib/jvm/java-13/bin),當我獲取 ~/.zshrc 時,它給了我想要的路徑(…/java-13/bin)。順便說一句,替換
&&
為;
也不起作用。謝謝!
*這是我在 stackxchange.com 的第一個問題,所以請不要太粗魯。
首先,別名不是函式,也不接受參數。相反,別名是簡單的替換:當您
goto foo
在命令行上鍵入並按 Enter 鍵時,shellgoto
會在執行命令行之前簡單地替換為別名的值。因此,
$@
不會擴展為傳遞給別名的參數。實際上,在這種情況下,它會擴展為傳遞給 shell 或您正在採購的腳本的參數。這就是第二次正常工作的原因:您現在在獲取文件goto
時已將目錄作為參數傳遞,並且當您再次聲明別名時將擴展為該參數。.zshrc``$@
此外,由於您使用的是
"
雙引號"
,因此在聲明別名時會立即$@
展開。要查看這種情況,請在您的 shell 啟動後立即鍵入不帶參數的內容以查看您的別名。alias
如果您希望
goto
能夠處理參數,則應將其聲明為函式:goto() { cd $@ && ... }
*但是,*作為一項規則,⚠️你不應該
source ~/.zshrc
。根據您的點文件中的內容,這可能會導致各種問題。相反,如果您對
.zshrc
文件進行了更改並且想要應用它們,您應該重新啟動終端(通過關閉目前選項卡/視窗並打開一個新的)或重新啟動 shell(通過鍵入exec $SHELL
)。