В другом месте я видел функцию CD, как показано ниже:
cd()
{
builtin cd "$@"
}
почему рекомендуется использовать $@
вместо $1
?
Я создал тестовый каталог "r st" и вызвал скрипт, содержащий эту функцию, и он работал в любом случае
$ . cdtest.sh "r st"
но $ . cdtest.sh r st
не удалось, использовал ли я "$@"
или"$1"
cd "$*"
также не будет работать правильно с более чем 1 аргументом.Ответы:
Потому что, согласно
bash(1)
,cd
принимает аргументыпоэтому, следовательно, каталог на самом деле может не быть, так
$1
как вместо этого может быть опция, такая как-L
или другой флаг.Насколько это плохо?
Все может пойти очень плохо, если вы окажетесь не там, где вы ожидаете, используя
cd "$1"
...источник
Использование
"$@"
передаст все аргументы туда,cd
где$1
будет передаваться только первый аргумент.В твоих примерах
всегда работает, когда вы передаете только один аргумент, но если вы должны передать флаг, такой как
Только
"$@"
тогда правильно выполнится, где"$1"
расширится доcd -L
полной потери каталога.тем не мение
Сбой в обоих случаях, так как вы передаете два параметра в cd,
r
иst
это не является допустимым способом выполнения cd. Параметры разделяются пробелами, которые должны быть заключены в кавычки (как в первом примере) или экранированы (r\ st
), чтобы рассматриваться как один аргумент.В случае компакт - диска , однако очень редко проходить в флажками , и вы не можете передать в нескольких каталогах , так что вы не будете видеть разницу в реальном мире использование либо
"$1"
или"$@"
для компакт - диска. Но для других команд , которые вы будете замечать разницу , так что лучше практика , чтобы всегда использовать ,"$@"
когда вы хотите создать функцию - оболочку или сценарий , как это.источник
Также есть случай, когда нет аргументов:
cd
без каких-либо аргументов изменения в домашнем каталоге. Без каких-либо аргументов"$@"
расширяется до нуля, но"$1"
расширяется до пустой строки. Это разные:источник
cd
- это хорошо. Это вызывает ошибку вместо перехода в домашний каталог. С некоторыми другими командами, в частностиrsync
, нулевой первый аргумент вызывает непредвиденное поведение (включает текущий каталог в источниках передачи).Аргументы скрипта bash разделены пробелом. $ 1 является первым аргументом. В твоих примерах ...
В примере 1 $ 1 - это строка «r st» ... во втором примере $ 1 - это строка из одного символа «r» ...
$ @ - это все аргументы.
источник