Как передать параметры псевдониму?

64

Для сценария Bash я могу использовать "$@"для доступа к аргументам. Какой эквивалент, когда я использую псевдоним?

prosseek
источник

Ответы:

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 "$@"
}
amphetamachine
источник
3
opengroup.org/onlinepubs/009695399/utilities/… Функции в shопределены my_program_wrapper() { ...; }. Bash работает с ключевым словом, functionно почему бы не пойти с тем, что более переносимо?
2010 года
2
@ephemient Очень верно. Я имею в виду, кроме того, что все используют GNU Bash, а не barebone-оболочку POSIX.
амфетамина
21

Решение Alias

Если вы действительно против использования функции как таковой, вы можете использовать:

$ 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 Хм, проблема с копировальной пастой? Подтвердили работу на bash 4.4.12.
Том Хейл,
1
Я fпсевдоним. После того, как я безошибочно fвсе работает нормально. Старое название, коллизия.
эллиптический вид
command type f:)
Том Хейл
1
здорово! это самый ленивый вариант!
Сергий
19

В дополнение к настоящим ответам важно понять, как работают псевдонимы, что все параметры, которые вы вводите после команды с псевдонимами, будут использоваться буквально в конце. Таким образом, нет никакого способа использовать псевдоним для двух команд (по конвейеру или нет), из которых первая должна интерпретировать параметры. Чтобы прояснить ситуацию, вот пример чего-то, что не будет работать так, как ожидалось:

alias lsswp="ls -l | grep swp"

(пример, вдохновленный этим вопросом ), он всегда будет использовать вывод ls -lexecute в текущем каталоге и выполнит grep для этого - поэтому, используя

lsswp / tmp /

будет эквивалентно ls -l | grep swp /tmp/ и нет ls -l /tmp/ | grep swp .

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

rozcietrzewiacz
источник
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

Стевица
источник