¿Cómo crear un alias que realmente extienda otro alias del mismo nombre en Bash?
Por qué:
Solía han GREP_OPTIONS
fijado en .bashrc
que algo como esto:
GREP_OPTIONS="-I --exclude=\*~"
También tenía un script (digamos setup-java.sh
) que llamaría antes de trabajar en algunos proyectos Java. Contendría la línea:
GREP_OPTIONS="$GREP_OPTIONS --exclude-dir=classes"
Si también uso Sass, llamaría a setup-sass.sh
cuál contiene la línea:
GREP_OPTIONS="$GREP_OPTIONS --exclude-dir=\*/.sass-cache"
Pero GREP_OPTIONS
quedó en desuso y aparentemente la solución estándar es crear un alias o algún script ...
Respuestas:
Bash almacena los valores de los alias en una matriz llamada
BASH_ALIASES
:Con la expansión de parámetros podemos obtener el último alias establecido (si existe) o el valor predeterminado:
Ahora solo hazlo en
setup-java.sh
:... y finalmente en
setup-sass.sh
:Si se llaman las tres líneas, obtenemos lo que queremos:
fuente
aliases
encadena si los terminas con espacios.Puedes escribir guiones completos de esa manera, si estás lo suficientemente loco. De todos modos, si quieres extender un alias, solo asegúrate de que el alias que deseas extender termine en un espacio, y agrega otro.
fuente
exdir
? (¿Es solo por alineación por razones estéticas?)fnmatch(){ alias fnmatch='case $1 in '; while "${1:+:}" 2>&-; do eval 'fnmatch pattern list ;; esac'; shift; done; unalias fnmatch; }; alias pattern='${1:+*}) ' list=': do stuff '; fnmatch "$@"
. Hacerlo con lealiases
permite utilizar las expansiones de los patrones de forma más directa y segura. Necesita un segundo contextoeval
cuando se lo llama desde una función, pero no es inherentemente inseguro siempre que los nombrespattern
ylist
estén controlados por usted. Solo pueden romperse en la mayoría de los casos, incluso cuando no lo están, a menos que algún atacante, a sabiendas, termine correctamentecase
..bashrc
:,alias sudo='sudo '
esto me permite llamar a todos mis comandos con alias después de asudo
. Sin el espacio no funcionaríaUna función es una mejor opción que un alias extensible aquí.
De esa manera, tiene dos opciones para agregar opciones al entorno:
Enmendar la
grep_options
matriz; esto admite correctamente las opciones con espacios, caracteres glob literales y otros casos de esquina:Use la
GREP_OPTIONS
variable escalar tradicional , a pesar de sus dificultades (vea BashFAQ # 50 para comprender algunos de estos):Dicho esto, si desea que sus opciones se reflejen en
grep
instancias invocadas fuera del shell, ni un alias ni una función funcionarán. En su lugar, querrá un script de contenedor colocado antes en su RUTA que elgrep
comando real . Por ejemplo:... y, en
~/bin/grep
:fuente