Quiero crear un script bash o algo similar que pueda ejecutar en el shell actual:
echo '#!/bin/bash
export foo="bar" ' > zoom.sh
pero si quiero ejecutar este script en el proceso actual:
exec ./zoom.sh
entonces mi terminal simplemente saldrá del "proceso completado", incluso si uso set +e
, todavía sale.
Hay source
y eval
cuál ejecutará cosas en el shell actual, entonces, ¿quizás eval sea mi mejor opción? Una función bash funcionará, pero source
en primer lugar tengo que confiar en que el usuario la utilice.
Respuesta1
Según el manual, parece que el ejecutivo no creará un nuevo proceso, simplemente reemplazará el shell actual, por lo que después de la ejecución también finalizará la sesión.
exec [-cl] [-a name] [command [arguments]]
:
Si se especifica el comando, reemplaza el shell. No se crea ningún proceso nuevo. Los argumentos se convierten en argumentos para mandar. Si se proporciona la opción -l, el shell coloca un guión al principio del argumento cero pasado al comando. Esto es lo que hace login(1). La-c
opción hace que el comando se ejecute con un entorno vacío. Si-a
se proporciona, el shell pasa el nombre como argumento cero al comando ejecutado. Si el comando no se puede ejecutar por algún motivo, se cierra un shell no interactivo, a menos que la opción del shellexecfail
esté habilitada, en cuyo caso devuelve un error. Un shell interactivo devuelve un error si el archivo no se puede ejecutar. Si no se especifica el comando, cualquier redireccionamiento tendrá efecto en el shell actual y el estado de retorno es 0. Si hay un error de redireccionamiento, el estado de retorno es 1.
$ cat zoom.sh
#!/bin/bash
export foo="bar"
echo $?
$ exec ./zoom.sh
0
Connection to localhost closed