
Entonces esta captura de pantalla básicamente lo explica.
https://gyazo.com/1a9d621efa28c7994c3a2afbe0411a2b
Tengo algunos alias configurados para abrir una nueva pestaña dentro de la terminal y hacer otras cosas, incluso un alias para ejecutar el script de shell de depuración, pero el debug.sh
script simplemente usa un alias, newtab
para intentar abrir una nueva pestaña, que funciona cuando simplemente se escribe newtab
, pero no funciona, ni tampoco ningún otro alias, desde un .sh o cualquier otro archivo ejecutable, ¿cómo soluciono esto?
Una cosa que noté fue que estoy poniendo todas mis export
'y alias
' /etc/bashrc
y no ~/.bash_profile
las otras, y apenas veo /etc/bashrc
que se mencione en ninguna parte.
¿Lo estoy haciendo bien?
Respuesta1
La expansión de alias se realiza sólo desde el shell interactivo, pero no dentro de los scripts, por lo que debug
se expande a newtab
, pero newtab
no se expande en sí, ya que se llama desde un script.
Si utiliza funciones exportadas en lugar de alias, funcionará: -
debug() { $scripts/debug.sh; }; export -f debug
...
newtab() { $scripts/newtab.osx.sh; }; export -f newtab
La exportación es necesaria, porque los scripts se ejecutan en subshells, aunque para el caso particular que usted cita, solo newtab
debe ser una función.
Se pueden usar funciones en lugar de alias en todas partes, pero pueden hacer mucho más, como agregar un parámetro adicional al final de la cadena de ejecución, un requisito muy simple que los alias no pueden cumplir. De hecho, pueden hacer cualquier cosa que los scripts puedan hacer, pero a diferencia de los scripts, se ejecutan en el shell actual, por lo que pueden cambiar el entorno y el directorio actual, para lo cual un script necesita .
o source
un comando para lograrlo.