En mi ~/.bashrc
archivo residen dos definiciones:
commandA
, que es un alias para un camino más largocommandB
, que es un alias para un script Bash
Quiero procesar el mismo archivo con estos dos comandos, así que escribí el siguiente script de Bash:
#!/bin/bash
for file in "$@"
do
commandA $file
commandB $file
done
Incluso después de cerrar sesión y volver a iniciar sesión, Bash me solicita command not found
errores para ambos comandos cuando ejecuto este script.
¿Qué estoy haciendo mal?
source ~/.bashrc
.Respuestas:
En primer lugar, como dijo ddeimeke, los alias por defecto no se expanden en shells no interactivos.
En segundo lugar,
.bashrc
no es leído por shells no interactivos a menos que establezca laBASH_ENV
variable de entorno.Pero lo más importante: ¡no hagas eso! ¿Por favor? Un día moverás ese script a algún lugar donde no se establezcan los alias necesarios y se romperá nuevamente.
En su lugar, establezca y use variables de entorno como accesos directos en su secuencia de comandos:
fuente
alias
casos de uso habituales . Por ejalias mv="mv -v --backup=numbered"
.$CMDA
/$CMDB
... Además de las variables en mayúsculas que se reservan para bash en bash, y de hecho funciona, esa falta de comillas me inquieta mucho ... Gracias de todos modos.gizmo
no está en el camino o que hay un comando con el mismo nombre pero con una prioridad más alta. de lo contrario, podría establecerCMDA
simplementegizmo
en claro en primer lugar.Si observa la página de manual de bash, encontrará:
Así que pon un
en tu guion
Asegúrese de obtener su archivo de alias después de configurar esto en su script.
fuente
shopt -s expand_aliases source ~/.bash_aliases
funciona perfectamente para mí. A menudo hay una forma de detección de shell interactiva en .bashrc como esta:# If not running interactively, don't do anything [ -z "$PS1" ] && return
@Zaid, tal vez desee verificar eso en el archivo que obtuvo.shopt -s expand_aliases
no tiene que ir antes de la definición del alias, sino antes del uso del alias. Agregar a @FrankSchubert: La detección de shell interactivo también se puede hacer usando$-
las opciones que contiene el shell, específicamentei
si el shell es interactivo.~/.bash_aliases
posible que dependa de otras cosas previamente cargadas en un shell interactivo ... Lo más parecido que encontré fue cambiar su hashbang a#!/bin/bash -li
Aún no perfecto. Idealmente, debe usar funciones y no alias.Los alias no se pueden exportar, por lo que no están disponibles en scripts de shell en los que no están definidos. En otras palabras, si los define en
~/.bashrc
ellos, no están disponiblesyour_script.sh
(a menos que se base~/.bashrc
en el script, lo cual no recomendaría, pero hay formas de hacerlo correctamente).Sin embargo, las funciones se pueden exportar y estarían disponibles para los scripts de shell que se ejecutan desde un entorno en el que se definen. Esto se puede hacer colocando esto en su bashrc:
Como dice el manual de Bash, "Para casi cualquier propósito, las funciones de shell son preferibles a los alias".
fuente
alias commandA=...
concommandA() { ... }
entoncesexport commandA
y obtiene un comportamiento idéntico al alias. Así que, por lo que sé, esta es una alternativa casi idéntica a los alias que funciona muy bien en los scripts de bashalias b=bash
hace que sea fácil hacer lob -c "echo test | grep test"
que sería difícil de hacer en funciones.b () { bash "$@"; }
entoncesb -c "echo test | grep test"
El
i
es para interactivos y fuentes de subash
perfil para usted.fuente
Descubrí que a veces el script bash tampoco reconoce la exportación. Sin embargo, cambiándolo a
funciona para mi.
fuente