it-swarm-ru.tech

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

Для сценария bash я могу использовать "[email protected]" для доступа к аргументам. Какой эквивалент, когда я использую псевдоним?

77
prosseek

Псевдонимы подобны командам в том, что все аргументы к ним передаются в качестве аргументов псевдониму программы. Например, если вы использовали псевдоним ls to 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 "[email protected]"
}
54
amphetamachine

решение Alias

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

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

Вы можете заменить [email protected] с $1 если вы хотите только первый аргумент.

Объяснение

Это создает временную функцию f, которой передаются аргументы.

Аргументы псевдонимов передаются только в конце. Обратите внимание, что f вызывается в самом конце псевдонима.

unset -f удаляет определение функции при выполнении псевдонима, чтобы потом не зависать.

34
Tom Hale

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

alias lsswp="ls -l | grep swp"

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

lsswp/tmp /

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

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

19
rozcietrzewiacz

Вы не должны ничего делать, на самом деле; псевдонимы делают это автоматически. Например:

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

Вы увидите первую страницу foo.txt, и less выйдет в EOF (-e), поиск будет выполняться без учета регистра (-i) и т.д.

15
Warren Young

Я отвечаю за 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

1
stevica