Як передати параметри псевдоніму?


64

Для bash script я можу використовувати "$@"доступ до аргументів. Який еквівалент, коли я використовую псевдонім?

Відповіді:


50

Псевдоніми - це як команди, оскільки всі аргументи їм передаються як аргументи до програми, яку вони псевдонімують. Наприклад, якщо ви були псевдонім , lsщоб ls -la, потім , набравши ls foo barбуде дійсно виконати ls -la foo barв командному рядку.

Якщо ви хочете мати фактичний контроль над інтерпретацією аргументів, ви можете написати функцію на зразок:

my_program_wrapper() {
    local first_arg="$1" \
          second_arg="$2"

    shift 2               # get rid of the first two arguments

    # ...

    /path/to/my_program "$@"
}

3
opengroup.org/onlinepubs/009695399/utilities/… Функції у shвизначені my_program_wrapper() { ...; }. Bash обробляє ключове слово, functionале чому б не піти з тим, що більш портативно?
ефемієнт

2
@ephemient Дуже вірно. Я маю на увазі, крім того, що кожен використовує GNU Bash, а не оболонку POSIX оболонки.
амфетамахін

21

Рішення псевдоніма

Якщо ви справді проти використання функції як такої, ви можете використовувати:

$ alias wrap_args='f(){ echo before "$@" after;  unset -f f; }; f'
$ wrap_args x y z
before x y z after

Ви можете замінити $@з , $1якщо ви хочете тільки перший аргумент.

Пояснення

Це створює тимчасову функцію f, якій передаються аргументи.

Аргументи псевдоніму передаються лише наприкінці. Зверніть увагу, що fназивається в самому кінці псевдоніма.

unset -fВидаляє визначення функції в якості псевдоніма виконується так що не стирчати після цього.


Гум? wrap_args x y zдає мені: bash: синтаксична помилка біля несподіваного маркера `('
Еліптичний вигляд

@Elipticalview Хм, виправити копію вставити? Підтверджено роботу над басом 4.4.12.
Том Хейл

1
Я був fпсевдонім. Як тільки я не маю на увазі, fце працює чудово. Старе ім’я зіткнення річ.
Еліптичний вигляд

command type f:)
Том Хейл

1
чудово! ось самий ледачий варіант!
Сергій

19

Додаючи до теперішніх відповідей, важливим для розуміння того, як працюють псевдоніми, є те, що всі параметри, які ви вводите після введення псевдонімової команди, будуть використовуватися буквально в кінці. Тому немає можливості використовувати псевдонім для двох команд (трубопровідних чи ні), з яких перша повинна інтерпретувати параметри. Щоб зрозуміти, ось приклад того, що не працюватиме так, як очікувалося:

alias lsswp="ls -l | grep swp"

(приклад, натхненний цим питанням ), це завжди використовуватиме результат, який ls -lвиконується у поточному каталозі, і робитиметься погіршення щодо цього - тому використовуючи

lsswp / tmp /

було б рівнозначно ls -l | grep swp /tmp/ і ні ls -l /tmp/ | grep swp .

Для всіх цілей, де аргументи слід використовувати десь посередині, потрібно використовувати functionзамість alias.


15

Насправді вам нічого не потрібно робити; псевдоніми роблять це автоматично. Наприклад:

$ alias less="less -eirqM"
$ less foo.txt

Ви побачите першу сторінку foo.txt і lessвийдете з EOF (-e), пошук буде нечутливим до регістру (-i) тощо.


Чи можете ви, будь ласка, подивитись на моє запитання - жодне з рішень для мене не працює, і мені не дозволяється починати щедро.
JJD

1
@JJD Правильний: хто відповів на ваше запитання: ви хочете функцію в цьому випадку, а не псевдонім. Оскільки прийнята відповідь на це питання по суті однакова, ваше запитання було правильно закрито.
Воррен Янг

1

Я відповідаю за csh:

Так, ви можете використовувати параметри в псевдонімах і - як відмінність від сказаного вище - ви можете посилатися на них де завгодно у визначенні псевдоніму - не тільки в кінці.

Приклад для tar-gz -ing щось:

$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"

, де !:1і !:2які параметри ви будете надавати під час виклику псевдоніма.

Приклад використання:

    $ ls
    clrcf.dat                             user_comment_2016.06.03_12:51:50.txt  user_comment_2016.06.03_12:54:48.txt
        TEST-wADM.tec                         user_comment_2016.06.03_12:52:04.txt  user_comment_2016.06.03_12:55:13.txt


    $ tgz user* out
    a user_comment_2016.06.03_12:51:50.txt 1K
a user_comment_2016.06.03_12:52:04.txt 1K
a user_comment_2016.06.03_12:54:48.txt 1K
a user_comment_2016.06.03_12:55:13.txt 1K

    $ ls out*
    out.tar.gz

Це фактично означає, що ви використовували два параметри, які ви вставляли у довільних місцях команди tar, роблячи все це псевдонімом tgz

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.