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.