Posso passar argumentos para um comando alias?

14

Eu quero saber se posso passar um argumento com um comando alias.

por exemplo:

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

Agora d imprimirá as últimas 5 linhas. Se eu quiser usar d para imprimir um número diferente de linhas, eu tenho que fazer a alteração na declaração do comando alias de d novamente.

Existe alguma maneira de modificar a declaração de um alias para que eu não precise redigitar a declaração para alterar o número de linhas. Como incorporar passando o número de linhas como um argumento enquanto declarando alias para d ? Ou há algum outro método para resolver isso?

    
por srk_cb 21.05.2015 / 11:29

3 respostas

17

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

Então: Use funções .

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

num=${1:-5} usa o primeiro argumento, com um valor padrão de 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 usadas levemente:

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

Depois, você pode passar opções adicionais de -n :

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

Se várias opções -n forem especificadas para tail , somente a última será usada.

    
por muru 21.05.2015 / 11:34
3

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

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

e chame o foo com:

foo arg1 arg2 arg3
    
por Ron 21.05.2015 / 11:34
2

Trabalhando com limitações de alias com o comando group e here-string

Os aliases não aceitam argumentos, mas podemos "simular" isso. Tomemos por exemplo o exemplo da minha resposta em esta questão .

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

Principais pontos que estão acontecendo aqui:

  • usamos read incorporado para ler uma string em uma variável d . Como queremos ler uma sequência completa incluindo caracteres em branco (novas linhas, tabulações, espaços), usamos IFS= e desabilitamos os backslash escapes com -r .
  • <<< , que é operador string-here , nos permite redirecionar qualquer string fornecida como argumento para mkcd alias; o uso seria como mkcd "some directory"
  • vários comandos dentro do alias são combinados e executados no shell atual usando { list; } structure (que é conhecido como group command no manual bash ). Observe que o espaço inicial após a lista de comandos individuais { e ; é necessário.

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 poderíamos usar matrizes para fornecer vários argumentos:

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

Mas esta boa abordagem?

Não necessariamente. O problema com essa abordagem é que ela é muito específica - os 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 usado, simplesmente porque no mundo real temos que lidar com argumentos complexos, então essa abordagem não é muito prática. Funções são muito mais flexíveis. E a necessidade de citar args string se torna irritante.

Apesar das limitações, isso funciona com strings simples como argumentos em que podemos permitir a divisão de palavras, permitindo-nos parcialmente dar argumentos aos aliases.

    
por Sergiy Kolodyazhnyy 23.06.2017 / 10:46