Cómo ejecutar algo en el shell actual

Cómo ejecutar algo en el shell actual

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 sourcey evalcuál ejecutará cosas en el shell actual, entonces, ¿quizás eval sea mi mejor opción? Una función bash funcionará, pero sourceen 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 -copción hace que el comando se ejecute con un entorno vacío. Si -ase 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 shell execfailesté 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

información relacionada