Як баш псевдонім розуміє "$ @"?


1

Я намагаюся написати псевдонім, щоб зробити 2 речі

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

але чомусь, коли я називаю це

$cde test
test

все, що трапляється, це ехо-тест:

Схоже, мій аргумент не передається до першого твердження, а замість цього використовується в кінці всього псевдоніма. З мого розуміння, The $@повинен був споживати всі аргументи, щоб він ніколи не доходив до відлуння. Я можу використовувати аргумент у першій частині, а не у другій?


Я написав загальну відповідь, але є деякі частини вашого питання, які є незрозумілими. "Я можу використовувати аргумент у першій частині, а не у другій?" - ти хочеш просто echoбез аргументів? Якого сенсу це має? Чому &&? Що ти хочеш, щоб саме сталося?
Каміль Маціоровський

Відповіді:


5

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

echo "$@"

(Це не показує точне розділення слів, але справа не в цьому).

Однак функція бере аргументи і має свої власні $@. Мені не ясно, чи хотіли ви, щоб ваш echoдрук псевдоніму "аргументи". Якщо так, я б зробив це замість псевдоніму:

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

А точніше:

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

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

Якщо ви хочете перевизначити, cdвам потрібно commandуникати нескінченного циклу (функція називатиме себе інакше):

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

1
Насправді це гірше. "$@", Коли псевдонім виконуються насправді то , що в даний час позиційного PARAMS є. Тестуйте псевдонім за допомогою set -- foo bar; cde baz->bash: cd: foo: No such file or directory
glenn jackman
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.