¿Es posible que un subshell ejecute algo en el shell padre?

Aug 20 2020

Tengo un script de shell que debe ser sourced, 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

2 StéphaneChazelas Aug 21 2020 at 00:28

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.zshenvse 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í.