Bash

為什麼我需要使用 cd ‘@‘我是tead_的_cd_’@‘一世ns噸和一種d這FCd’@’ instead of cd ‘1’ 為 cd 編寫包裝器時?

  • December 3, 2017

在其他地方,我看到了一個 cd 函式,如下所示:

cd()
{
builtin cd "$@"
}

為什麼建議使用$@而不是$1

我創建了一個測試目錄“r st”並呼叫了包含這個函式的腳本,它可以以任何方式工作

$ . cdtest.sh "r st"

$ . cdtest.sh r st無論我使用"$@"還是失敗"$1"

因為,根據bash(1)cd接受參數

  cd [-L|[-P [-e]] [-@]] [dir]
         Change  the  current  directory to dir.  if dir is not supplied,
         ...

因此,因此該目錄實際上可能不在其中,$1因為它可能是一個選項,例如-L或另一個標誌。

這有多糟糕?

$ cd -L /var/tmp
$ pwd
/var/tmp
$ cd() { builtin cd "$1"; }
$ cd -L /var/tmp
$ pwd
/home/jhqdoe
$ 

如果您最終不在您期望使用的地方,事情可能會變得非常糟糕cd "$1"……

using"$@"會將所有參數傳遞給cdwhere ,因為$1只會傳遞第一個參數。

在你的例子中

$ . cdtest.sh "r st"

始終有效,因為您只傳遞一個參數,但是如果您還要傳遞一個標誌,例如

$ . cdtest.sh -L "r st"

然後只有在哪裡會"$@"正確執行才會完全失去目錄。"$1"``cd -L

然而

$ . cdtest.sh r st

在這兩種情況下都會失敗,因為您將兩個參數傳遞給 cd,rst不是執行 cd 的有效方式。參數由必須引用的空格分隔(如在您的第一個範例中)或轉義 ( r\ st) 以被視為一個參數。

然而,在 cd 的情況下,傳遞標誌是非常少見的,並且您不能傳遞多個目錄,因此您不會看到實際使用cd"$1""$@"cd 的區別。但是對於其他命令,您"$@"注意到不同之處,因此當您想要創建這樣的包裝函式或腳本時,最好始終使用它。

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