Solución de limitaciones de alias con comando de grupo y here-string
Los alias no pueden tomar argumentos, pero podemos "simular" eso. Tomemos, por ejemplo, un ejemplo de mi respuesta a esta pregunta .
alias mkcd='{ IFS= read -r d && mkdir "$d" && cd "$d"; } <<<'
Puntos clave que están sucediendo aquí:
- Usamos
read
incorporado para leer una cadena en una variable d
. Debido a que queremos leer una cadena completa que incluya caracteres en blanco (líneas nuevas, pestañas, espacios), utilizamos IFS=
y deshabilitamos los escapes de barra invertida -r
.
<<<
que es operador de cadena aquí nos permite redirigir cualquier cadena que proporcionemos como argumento al mkcd
alias; el uso sería comomkcd "some directory"
- múltiples comandos dentro del alias se combinan y ejecutan en el shell actual usando la
{ list; }
estructura (que se conoce como group command
en el bash
manual) Tenga en cuenta que se requieren espacios iniciales después {
y ;
una lista individual de comandos.
En su ejemplo específico podríamos hacer:
alias d='{ IFS= read -r n; dmesg | grep -iw "usb" | tail -n ${n:-5};} <<<'
También podríamos hacer uso de la división de palabras para almacenar argumentos separados por espacios:
bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";} <<< "arg1 arg2"
arg1
arg2
O podríamos usar matrices para proporcionar múltiples argumentos:
bash-4.3$ { read -a arr; echo "${arr[1]}"; echo "${arr[0]}";} <<< "arg1 arg2"
arg2
arg1
¿Pero es este buen enfoque?
No necesariamente. El problema con este enfoque es que es muy específico: los argumentos no se pueden citar fácilmente, lo que significa que solo podemos tener argumentos sin espacios.
bash-4.3$ { read -r a1 a2; echo "$a1"; echo "$a2";} <<< "'arg1 with space' arg2"
'arg1
with space' arg2
Por supuesto, esto no es algo que se usaría ampliamente, simplemente porque en el mundo real tenemos que lidiar con argumentos complejos, por lo que este enfoque no es muy práctico. Las funciones son mucho más flexibles. Y la necesidad de citar una cadena de args se vuelve molesta rápidamente.
A pesar de las limitaciones, esto funciona con cadenas simples como argumentos donde podemos permitirnos la división de palabras, por lo que en parte nos permite dar argumentos a los alias.