Shell-Script

為什麼我必須使用此命令兩次才能執行它?

  • May 21, 2021

我做了一個別名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)。

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