Cuando uso el exitcomando en un script de shell, el script terminará el terminal (el indicador). ¿Hay alguna forma de terminar un script y luego permanecer en la terminal?
run.shSe espera que mi script se ejecute directamente a partir de otro script.
EDITAR: para ser más específicos, hay dos scripts run2.shcomo
...
. run.sh
echo "place A"
...
y run.shcomo
...
exit
...
cuando lo ejecuto . run2.sh, y si exittoca la línea de código run.sh, quiero que se detenga en la terminal y permanezca allí. Pero usando exit, toda la terminal se cierra.
PD: He intentado usar return, pero la línea de echocódigo aún se ejecutará ...

exit 0para terminar la secuencia de comandos después del éxito, cuando ejecutas tu secuencia de comandos ej:./test.shdeberías ver la salida pero tu consola permanecerá abierta.shellcomando, que de hecho abre un terminal de shell. Sin embargo, mi propia experiencia es que esto no sucede conexit. Salir normalmente devuelve el control al script principal.Respuestas:
El "problema" realmente es que estás buscando y no ejecutando el script. Cuando obtiene un archivo, su contenido se ejecutará en el shell actual, en lugar de generar un subshell. Por lo tanto, todo, incluida la salida, afectará al shell actual.
En lugar de usar
exit, querrás usarreturn.fuente
runs.sh@ruakh tiene la mejor respuesta a esta pregunta.sh <script>obash <script>si uno quiere ejecutar un script y terminar en algún momentoSi; puedes usar en
returnlugar deexit. Su propósito principal es regresar de una función de shell, pero si la usa dentro de unsourcescript -d, regresa de ese script.Como dice §4.1 "Bourne Shell Builtins" del Manual de referencia de Bash :
fuente
returnSOLO se puede usar desde una función. Si lo usareturny lo ejecuta como un script de shell (psh run.sh. Ej. ), Bash informará de un error:return: can onlydevuelve 'desde una función o script de origen'returneso no funcionará si el script se ejecuta como un script de shell y no es ejecutado por. (osource) Por cierto, ¿dónde puedo encontrar el documentosource -d?En lugar de ejecutar el script usando
. run2.sh, puede ejecutarlo usandosh run2.shobash run2.shSe iniciará un nuevo sub-shell, para ejecutar el script, se cerrará al final del script dejando abierto el otro shell.
fuente
sh "." run2.sh?Puede agregar un comando de salida adicional después de la declaración / comando de retorno para que funcione para ambos, ejecutando el script desde la línea de comando y buscando desde el terminal.
Ejemplo de código de salida en el script:
exitNo se llamará a la línea con el comando cuando obtenga el script después delreturncomando.Cuando ejecuta el script, el
returncomando da un error. Entonces, suprimimos el mensaje de error enviándolo a/dev/null.fuente
En realidad, creo que podrías estar confundido por cómo deberías hacerlo
run a script.Si usa
shpara ejecutar una secuencia de comandos, por ejemplo,sh ./run2.shincluso si la secuencia de comandos incrustada termina conexit, su ventana de terminal permanecerá.Sin embargo, si usa
.osource, su ventana de terminal también se cerrará / cerrará cuando finalice el subíndice.para obtener más detalles, consulte ¿Cuál es la diferencia entre usar
shysource?fuente
Esto es como si pusieras una función de ejecución dentro de tu script run2.sh. Utiliza el código de salida dentro de la ejecución mientras que la fuente de su archivo run2.sh en el bash tty. Si le da a la función de ejecución su poder para salir de su script y le da a run2.sh su poder para salir del terminador. Entonces, porque la función de ejecución tiene poder para salir de su teminador.
De todos modos, apruebo con Kaz que es un problema de diseño.
fuente
Tuve el mismo problema y de las respuestas anteriores y de lo que entendí, lo que funcionó para mí fue:
Tener una línea shebang que invoque el script deseado, por ejemplo,
#!/bin/bashutilizabashpara ejecutar el scriptTengo guiones con ambos tipos de shebang. Debido a esto, usar
sho.no fue confiable, ya que condujo a una mala ejecución (como cuando el script rescata haber ejecutado de manera incompleta)La respuesta por lo tanto, fue
(chmod +x file.sh)Invocarlo directamente sin ninguno
sho.(./myscript.sh)Espero que esto ayude a alguien con una pregunta o problema similar.
fuente
Creo que esto sucede porque lo estás ejecutando en modo fuente con el punto
Deberías ejecutar eso en una subshell:
'fuente' http://ss64.com/bash/source.html
fuente
. myscript.shfunciona. A lo sumo, podría necesitar./myscript.sh.Es correcto que las secuencias de comandos de origen vs. ejecutadas usen
returnvs.exitpara mantener abierta la misma sesión, como han señalado otros.Aquí hay un consejo relacionado, si alguna vez desea un script que mantenga abierta la sesión, independientemente de si proviene o no.
El siguiente ejemplo se puede ejecutar directamente como
foo.sho como. foo.sh/source foo.sh. De cualquier manera, mantendrá la sesión abierta después de "salir". La$@cadena se pasa para que la función tenga acceso a los argumentos del script externo.Resultado terminal:
Esto puede ser útil para probar rápidamente los cambios de script en un solo terminal mientras mantiene un montón de código de desecho debajo de la página principal
exit/returnmientras trabaja. También podría hacer que el código sea más portátil en cierto sentido (si tiene toneladas de scripts que se pueden invocar o no de diferentes maneras), aunque es mucho menos complicado usarloreturny, segúnexitcorresponda.fuente
Si su emulador de terminal no tiene
-hold, puede desinfectar un script de origen y mantener el terminal con:de lo contrario puedes usar
$TERM -hold -e scriptfuente
También asegúrese de regresar con el valor de retorno esperado. De lo contrario, si usa exit cuando encuentre una salida, saldrá de su shell base ya que la fuente no crea otro proceso (instancia).
fuente
Para escribir un guión que es seguro para ser ejecutado ya sea como un script de shell o de origen como un archivo rc, el guión puede comprobar y comparar
$0y$BASH_SOURCEy determinar siexitpueden usarse con seguridad.Aquí hay un fragmento de código corto para eso
fuente
1) la salida 0 saldrá del script si tiene éxito.
2) la salida 1 saldrá del script si es una falla.
Puede probar estos dos anteriores en función de su solicitud.
fuente