Posso passar argumentos para um comando de alias?

19

Quero saber se posso passar um argumento com um comando de alias.

por exemplo:

alias d="dmesg|grep -iw usb|tail -5" 

Agora dimprimirá as últimas 5 linhas. Se eu quiser usar d para imprimir um número diferente de linhas, preciso alterar dnovamente a declaração do comando alias .

Existe alguma maneira de modificar a declaração de um alias para não precisar redigitar a declaração para alterar o número de linhas. Como incorporar a passagem do número de linhas como argumento e declarar alias para d? Ou existe algum outro método para resolver isso?

srk_cb
fonte
Em (t) csh, "\! *" Faz referência a argumentos para um pseudônimo (a barra invertida é apenas para escapar do ponto de exclamação que normalmente significa "história"), e você pode até fazer referência a argumentos individuais, embora eu não lembre como. Então, talvez "tail -n \! *" Ou algo assim (acho que \! * Não funcionará com um sinal de menos imediatamente antes). No entanto, não tenho certeza se isso funcionará em (ba) sh.
Barrycarter #

Respostas:

20

Os aliases não aceitam argumentos. Com um alias como alias foo='bar $1', o $1será expandido pelo shell para o primeiro argumento do shell (que provavelmente não é nada) quando o alias for executado.

Então: use funções , em vez disso.

d () {
  num=${1:-5}
  dmesg |grep -iw usb|tail -$num
}

num=${1:-5} usa o primeiro argumento, com um valor padrão 5, se não for fornecido.

Então você pode fazer:

$ d
# prints 5 lines
$ d 10
# prints 10 lines

Ou, se você alterar as opções que você usou um pouco:

alias d="dmesg|grep -iw usb|tail -n 5"

Então você pode passar -nopções adicionais :

$ d
# prints 5 lines
$ d -n 10
# prints 10 lines

Se várias -nopções forem especificadas para tail, apenas a última será usada.

muru
fonte
Para os funcionalmente desafiados como eu :) pode ser útil indicar brevemente onde colocar a função ... ~/.bashrcou seja, rc.localou onde?
WinEunuuchs2Unix
@ WinEunuuchs2Unix onde quer que o apelido tivesse sido colocado.
muru
5

Você precisa ter uma função para isso, conforme descrito no SO e aqui . Tente o seguinte:

foo() { /path/to/command "$@" ;}

e chame o foocom:

foo arg1 arg2 arg3
Ron
fonte
4

Solução de limitações de alias com comando de grupo e cadeia de caracteres here

Os aliases não podem aceitar argumentos, mas podemos "simular" isso. Tomemos, por exemplo, um exemplo da minha resposta a esta pergunta .

alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<'

Pontos principais que estão acontecendo aqui:

  • usamos readconstruído para ler uma string em uma variável d. Como queremos ler uma sequência completa, incluindo caracteres em branco (novas linhas, guias, espaços), usamos IFS=e desabilitamos as barras invertidas -r.
  • <<<o operador here-string permite redirecionar qualquer string que forneça como argumento para o mkcdalias; o uso seria tãomkcd "some directory"
  • vários comandos no alias são combinados e executados no shell atual usando a { list; }estrutura (que é conhecida como group commandno bashmanual). Observe que o espaço à esquerda {e ;a lista individual de comandos são necessários.

No seu exemplo específico, poderíamos fazer:

alias d='{ IFS= read -r n; dmesg | grep -iw "usb" | tail -n ${n:-5};} <<<'

Também poderíamos usar a divisão de palavras para armazenar argumentos separados por espaço:

bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";}  <<< "arg1 arg2"
arg1
arg2

Ou podemos usar matrizes para fornecer vários argumentos:

bash-4.3$ { read -a arr; echo "${arr[1]}"; echo "${arr[0]}";}  <<< "arg1 arg2"
arg2
arg1

Mas essa é uma boa abordagem?

Não necessariamente. O problema dessa abordagem é que ela é muito específica - argumentos não podem ser citados facilmente, o que significa que só podemos ter argumentos sem espaços.

bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";}  <<< "'arg1 with space' arg2"
'arg1
with space' arg2

Obviamente, isso não é algo que seria amplamente utilizado, simplesmente porque no mundo real temos que lidar com argumentos complexos, portanto essa abordagem não é muito prática. As funções são muito mais flexíveis. E a necessidade de citar args string se torna irritante rapidamente.

Apesar das limitações, isso funciona com cadeias simples como argumentos nos quais podemos permitir a divisão de palavras, assim, parcialmente nos permite fornecer argumentos para aliases.

Sergiy Kolodyazhnyy
fonte