¿Es posible que un subshell ejecute algo en el shell padre?
Tengo un script de shell que debe ser source
d, porque su propósito es establecer un montón de variables de entorno en el entorno actual.
En caso de que el futuro me olvide, el guión comienza con:
#!/usr/bin/env bash
mustBeSourced() {
>&2 echo "This script must be sourced."
exit 1
}
(return 0 2>/dev/null) || mustBeSourced
Me encuentro con esta situación con frecuencia, para muchos scripts que uso con regularidad. Me gustaría liberarme de la necesidad de recordar cuáles de mis guiones deben obtenerse, así como esos pequeños momentos en los que me olvido.
¿Hay alguna forma de que el script, en lugar de decirle al usuario que obtenga el script, le diga al shell que llama que obtenga el script?
Mi shell de llamada suele ser zsh, pero aceptaría una solución compatible con bash o dash si no es posible con zsh. El script está escrito actualmente como un script bash, pero no tengo ningún problema en cambiarlo a otro shell (o lenguaje compatible con shebang no shell) si puede lograr lo que quiero.
Tengo el presentimiento de que esto no es posible, al menos no sin algunas travesuras serias.
Respuestas
Con zsh
, puede utilizar alias de sufijo (consulte los info zsh aliasdetalles)
alias -s zshenv=source
Para asegurarse de que cuando invoque some-file.zshenv
, source some-file.zshenv
se ejecute en su lugar.
Tener un código de inyección ejecutable en su proceso padre posiblemente podría lograrse usando depuradores, pero no quiere ir allí.