Bash
為什麼我需要使用 cd ‘@‘我是tead_的_cd_’@‘一世ns噸和一種d這FCd’@’ instead of cd ‘1’ 為 cd 編寫包裝器時?
在其他地方,我看到了一個 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
"$@"
會將所有參數傳遞給cd
where ,因為$1
只會傳遞第一個參數。在你的例子中
$ . cdtest.sh "r st"
始終有效,因為您只傳遞一個參數,但是如果您還要傳遞一個標誌,例如
$ . cdtest.sh -L "r st"
然後只有在哪裡會
"$@"
正確執行才會完全失去目錄。"$1"``cd -L
然而
$ . cdtest.sh r st
在這兩種情況下都會失敗,因為您將兩個參數傳遞給 cd,
r
這st
不是執行 cd 的有效方式。參數由必須引用的空格分隔(如在您的第一個範例中)或轉義 (r\ st
) 以被視為一個參數。然而,在 cd 的情況下,傳遞標誌是非常少見的,並且您不能傳遞多個目錄,因此您不會看到實際使用cd
"$1"
或"$@"
cd 的區別。但是對於其他命令,您會"$@"
注意到不同之處,因此當您想要創建這樣的包裝函式或腳本時,最好始終使用它。