Los scripts de shell normalmente se tratan como si fueran los mismos que cualquier otro tipo de archivo ejecutable, como archivos binarios, scripts de Python, scripts de Perl o cualquier otro tipo de script. Tienen un shebang en la parte superior que dirige el núcleo para ejecutarlos a través del shell. Se espera que se invoquen de la misma manera que cualquier otro comando.
Como tal, se inicia un nuevo shell cada vez que se invoca el script, y cualquier configuración como la set -f
presente en el shell de invocación o en cualquier otra instancia de shell en el sistema es irrelevante.
Por supuesto, es posible que los usuarios obtengan su script en lugar de ejecutarlo, por ejemplo, así:
. /path/to/your/script
o para ejecutarlo en un shell que tiene configuraciones no predeterminadas como esta:
sh -f /path/to/your/script
pero esas no se consideran formas normales o invocando su script, y los usuarios que hacen eso deben esperar lo que obtengan como resultado.
Tenga en cuenta que hay algunos scripts que están destinados a ser obtenidos, no ejecutados, porque su propósito es hacer cosas como cambiar el cwd o establecer variables de entorno que deben reflejarse en el entorno del shell de abastecimiento, pero son minoritarias y generalmente se hace como parte de un protocolo acordado. Estos archivos se pueden considerar más como "complementos" para cualquier sistema del que esperan obtener, no tanto como scripts independientes. Por ejemplo, los archivos /etc/rc*.d
con nombres que terminan .sh
provienen del subsistema de script de inicio, no se ejecutan, y está documentado que esto es lo que sucederá si coloca un archivo con ese nombre en/etc/rc*.d
y cuando se hace, se hace a propósito. La convención de nombrar archivos destinados a ser obtenidos en lugar de ejecutarse de esta manera también se sigue en otro lugar, pero no universalmente.
Es cierto que los archivos destinados a ser obtenidos de esta manera tienen que cuidar qué configuraciones pueden estar presentes en el entorno de su interlocutor que puedan afectar el comportamiento del shell, pero entonces el protocolo acordado idealmente debería prometer un entorno de ejecución predecible.
shell_state=$(set +o)
... guión ...eval "$shell_state"