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
read
construí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 mkcd
alias; 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 command
no bash
manual). 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.