Como passar parâmetros para um alias?

64

Para script bash, posso usar "$@"para acessar argumentos. Qual é o equivalente quando eu uso um alias?

prosseek
fonte

Respostas:

50

Os aliases são como comandos, pois todos os argumentos para eles são passados ​​como argumentos para o programa que eles alias. Por exemplo, se você aliasse lspara ls -la, a digitação ls foo barseria realmente executada ls -la foo barna linha de comando.

Se você deseja ter controle real sobre como os argumentos são interpretados, você pode escrever uma função como esta:

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

    shift 2               # get rid of the first two arguments

    # ...

    /path/to/my_program "$@"
}
anfetamaquina
fonte
3
opengroup.org/onlinepubs/009695399/utilities/… Funções em shsão definidas my_program_wrapper() { ...; }. O Bash lida com a palavra-chave, functionmas por que não usar o que é mais portátil?
ephemient 5/11/10
2
@hemhemient Muito verdade. Quero dizer, além do fato de que todo mundo usa o GNU Bash e não o shell POSIX dos barebones.
Amphetamachine
21

Solução de alias

Se você é realmente contra usar uma função em si, você pode usar:

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

Você pode substituir $@por $1se desejar apenas o primeiro argumento.

Explicação

Isso cria uma função temporária f, à qual são passados ​​os argumentos.

Argumentos de alias são passados ​​apenas no final. Observe que isso fé chamado no final do alias.

Ele unset -fremove a definição da função, pois o alias é executado para que não fique por aí depois.

Tom Hale
fonte
Humm? wrap_args x y zme dá: bash: erro de sintaxe próximo ao token inesperado `('
Elliptical view
@Elipticalview Hmm, copiar e colar problema? Trabalho confirmado no bash 4.4.12.
Tom Hale
11
Eu tinha um fpseudônimo. Depois que eu desalinhado, fele funciona bem. O velho nome da colisão.
Visualização elíptica
command type f:)
Tom Hale
11
ótimo! essa é a variante mais preguiçosa!
Sergius
19

Adicionando às respostas presentes, uma coisa importante a ser percebida sobre como funcionam os aliases é que todos os parâmetros digitados após um comando com alias serão usados ​​literalmente no final. Portanto, não há como usar o alias para dois comandos (canalizados ou não), dos quais o primeiro deve interpretar os parâmetros. Para deixar claro, aqui está um exemplo de algo que não funcionaria conforme o esperado:

alias lsswp="ls -l | grep swp"

(um exemplo inspirado nesta pergunta ), ele sempre usará a saída ls -lexecutada no diretório atual e fará um grep sobre isso.

lsswp / tmp /

seria equivalente ls -l | grep swp /tmp/ e não ls -l /tmp/ | grep swp .

Para todos os propósitos em que os argumentos devem ser usados ​​em algum lugar no meio, é preciso usar um em functionvez de alias.

rozcietrzewiacz
fonte
15

Você não precisa fazer nada, na verdade; aliases fazem isso automaticamente. Por exemplo:

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

Você verá a primeira página do foo.txt e fechará lessno EOF (-e), as pesquisas não diferenciam maiúsculas de minúsculas (-i), etc.

Warren Young
fonte
Você pode, por favor, examinar minha pergunta - nenhuma das soluções funciona para mim e eu não tenho permissão para iniciar uma recompensa.
JJD
11
@JJD Quem respondeu à sua pergunta está correto: você deseja uma função nesse caso, não um apelido. Como a resposta aceita a essa pergunta é essencialmente a mesma, sua pergunta foi encerrada corretamente.
Warren Young
1

Estou respondendo pelo csh:

Sim, você pode usar os parâmetros em pseudônimos e - como uma diferença do que foi dito acima - você pode consultá-los em qualquer lugar na definição de pseudônimo - não apenas no final.

Exemplo para tar-gz -ing something:

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

, onde !:1e !:2são os parâmetros que você fornecerá ao chamar seu alias.

Exemplo de uso:

    $ 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

O que significa efetivamente que você usou dois parâmetros inseridos em locais arbitrários do comando tar, fazendo de tudo um alias tgz

Stevica
fonte