Utilizo un script (al que no tengo acceso de escritura) que crea un grupo de alias para configurar un entorno. Me gustaría crear una función bash para configurar mi entorno, pero parece que los alias no sobreviven al cuerpo de la función.
Aquí hay un ejemplo mínimo:
# aliases.sh
alias fooAlias='echo "this will never work!"'
.
# .bashrc
function setupLotsOfThings() {
source aliases.sh
fooAlias
}
.
Ahora, si simplemente origen aliases.sh
interactivamente, las cosas funcionan como se esperaba:
[mycomputer]~/ $ source aliases.sh
[mycomputer]~/ $ fooAlias
this will never work!
Sin embargo, si en su lugar llamo a la función definida en mi .bashrc, no reconoce el alias después de obtener su definición:
[mycomputer]~/ $ setupLotsOfThings
-bash: fooAlias: command not found
¿Que esta pasando aqui? ¿Hay algo que me falta sobre el alcance del alias
comando cuando se usa en una función?
Editar: agregaré algunos detalles más allá del ejemplo mínimo para arrojar algo de luz sobre lo que estoy tratando de lograr.
Para mi trabajo, desarrollo y ejecuto una gran cantidad de software en un clúster y / o grilla. Tengo varios proyectos que requieren entornos completamente diferentes, como diferentes versiones de gcc, lanzamientos de software específicos, RUTA de configuración y datos, y varias variables de entorno. Los administradores proporcionan los scripts para configurar varias cosas, generalmente definiendo funciones o alias de shell, que invocan otras funciones o alias o ejecutan varios scripts. Para mí, es una caja negra.
Me gustaría configurar mis propios entornos con un solo comando. Actualmente, hago algo como:
[mycomputer]~/ $ source /some/environment/setup/script.sh
[mycomputer]~/ $ aliasToSetupSomeSoftwareVersion #this was defined in the above
[mycomputer]~/ $ anotherAliasForOtherSoftware
[mycomputer]~/ $ source /maybe/theres/another/script.sh
[mycomputer]~/ $ runSomeOtherSetup # this was defined in the new script
Estos comandos generalmente tienen que ejecutarse en orden. Básicamente, mi idea era copiar las líneas anteriores en un bloque de funciones, pero como muestra el ejemplo original, eso simplemente no funciona. ¡Las soluciones alternativas son más que bienvenidas!
setupLotsOfThings
, simplemente no están disponibles para la función en sí. Funcionan desde el shell desde el que llamó a la función. De todos modos, si su función solo genera alias, ¿por qué no usar un alias? Por ejemplo:alias setupstuff="source aliases.sh"
.En realidad, ¡tus alias están disponibles después de cargar la función! Puede usarlos en su shell interactivo o en su
.bashrc
después de ejecutar la función.La restricción es que los alias en una definición de función se expanden cuando se lee la definición de función, no cuando se evalúa la función. Esta es una limitación de bash. Entonces esto funcionará:
Pero no esto:
Si necesita alias que se puedan utilizar dentro de las funciones y puedan definirse después de analizar la función, conviértalas en funciones. Recuerde que puede usar la función
command
incorporada para invocar un comando externo desde una función del mismo nombre.fuente