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

327
Sepehr Nazari

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

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

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

$cde test test 

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

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

1
Я написал общий ответ, но есть некоторые части вашего вопроса, которые неясны. «Как я могу использовать аргумент в первой части, а не во второй?» - хочешь просто `эхо` без аргументов? Какой смысл это имеет? Почему `&&`? ** Что вы хотите, чтобы произошло именно? ** Kamil Maciorowski 7 лет назад 0

1 ответ на вопрос

5
Kamil Maciorowski

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

echo "$@" 

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

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

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

Или скорее:

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

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

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

cd() { command cd "$@" ; pwd ; } 
Это на самом деле хуже, чем это. `" $ @ "` При выполнении псевдонима фактически соответствует ** текущему ** позиционному параметру. Проверьте псевдоним с помощью `set - foo bar; cde baz` -> `bash: cd: foo: Нет такого файла или каталога` glenn jackman 7 лет назад 1