Как псевдоним bash понимает «$ @»?

1

Я пытаюсь написать псевдоним, чтобы сделать 2 вещи

$alias cde='cd "$@" && echo'

но по какой-то причине, когда я звоню с

$cde test
test

все, что происходит, это эхо-тест:

Похоже, мой аргумент не передается первому утверждению, а вместо этого используется в конце всего псевдонима. Из моего понимания $@ должен был использовать все аргументы, чтобы он никогда не достигал эха. В любом случае я могу использовать аргумент в первой части, а не во второй?

Sepehr Nazari
источник
Я написал общий ответ, но есть некоторые части вашего вопроса, которые неясны. «Как я могу использовать аргумент в первой части, а не во второй?» - ты хочешь просто echo без аргументов? Какой смысл это имеет? Зачем &&? Что именно вы хотите, чтобы произошло?
Kamil Maciorowski

Ответы:

5

Псевдоним не принимает аргументов. Он просто заменяет одну строку другой в вашей командной строке. Там нет отдельного $@ для псевдонима так "$@" не расширяется, как вы ожидали здесь. Он расширяется, как если бы вы печатали прямо в командной строке (вручную):

echo "$@"

(Это не показывает точное разделение слов, но это не главное).

Однако функция принимает аргументы и имеет свои $@, Мне не ясно, хотел ли ты echo напечатать ваш псевдоним "аргументы". Если это так, я бы сделал это вместо псевдонима:

cde() { cd "$@" ; echo "$@" ; }

Или скорее:

cde() { cd "$@" ; pwd ; }

Разница заключается в обработке (повторении) нескольких аргументов, расширении путей, таких как .. и т. д. Также -L а также -P варианты pwd может быть полезным

Если вы хотите переопределить cd тогда вам нужно command чтобы избежать бесконечного цикла (в противном случае функция вызывала бы себя сама):

cd() { command cd "$@" ; pwd ; }
Kamil Maciorowski
источник
1
Это на самом деле хуже, чем это. "$@" когда псевдоним выполняется на самом деле независимо от ток позиционные параметры есть. Проверьте псевдоним с set -- foo bar; cde baz - & GT; bash: cd: foo: No such file or directory
glenn jackman