it-swarm-es.tech

¿Por qué mi script Bash no reconoce alias?

En mi ~/.bashrc archivo residen dos definiciones:

  1. commandA, que es un alias para una ruta más larga
  2. commandB, que es un alias de 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 "[email protected]"
    do
    commandA $file
    commandB $file
done

Incluso después de cerrar sesión y volver a iniciar sesión, Bash me muestra command not found errores para ambos comandos cuando ejecuto este script.

¿Qué estoy haciendo mal?

237
Zaid

En primer lugar, como dijo ddeimeke, los alias por defecto no se expanden en shells no interactivos.

Segundo, .bashrc no es leído por shells no interactivos a menos que establezca el BASH_ENV Variable ambiental.

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:

#!/bin/bash

CMDA=/path/to/gizmo
CMDB=/path/to/huzzah.sh

for file in "[email protected]"
do
    $CMDA "$file"
    $CMDB "$file"
done
125
user601

Si observa la página de manual de bash, encontrará:

Los alias no se expanden cuando el Shell no es interactivo, a menos que la opción expand_aliases Shell se configure usando shopt (consulte la descripción de shopt en Shell BUILTIN COMMANDS a continuación).

Así que pon un

shopt -s expand_aliases

en tu guion.

Asegúrese de obtener su archivo de alias después de configurar esto en su script.

shopt -s expand_aliases
source ~/.bash_aliases
175
ddeimeke

Los alias no se pueden exportar, por lo que no están disponibles en los scripts de Shell en los que no están definidos. En otras palabras, si las define en ~/.bashrc no están disponibles para your_script.sh (a menos que la fuente ~/.bashrc en el script, que 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 foo 

Como dice el manual de Bash, "Para casi cualquier propósito, las funciones de Shell son preferibles a los alias".

[cmd line] > bash -i [your script's file path]

El i es para interactivos y obtiene su perfil bash para usted.

11
user65576