En mi ~/.bashrcarchivo 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 founderrores 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,
.bashrcno es leído por shells no interactivos a menos que establezca laBASH_ENVvariable 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
aliascasos 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.gizmono 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 establecerCMDAsimplementegizmoen 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_aliasesfunciona 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_aliasesno 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íficamenteisi el shell es interactivo.~/.bash_aliasesposible que dependa de otras cosas previamente cargadas en un shell interactivo ... Lo más parecido que encontré fue cambiar su hashbang a#!/bin/bash -liAú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
~/.bashrcellos, no están disponiblesyour_script.sh(a menos que se base~/.bashrcen 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:
foo () { echo "¡Hola Mundo!" } export -f fooComo dice el manual de Bash, "Para casi cualquier propósito, las funciones de shell son preferibles a los alias".
fuente
alias commandA=...concommandA() { ... }entoncesexport commandAy 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=bashhace 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
ies para interactivos y fuentes de subashperfil para usted.fuente
Descubrí que a veces el script bash tampoco reconoce la exportación. Sin embargo, cambiándolo a
funciona para mi.
fuente