Cuando uso el exit
comando 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.sh
Se espera que mi script se ejecute directamente a partir de otro script.
EDITAR: para ser más específicos, hay dos scripts run2.sh
como
...
. run.sh
echo "place A"
...
y run.sh
como
...
exit
...
cuando lo ejecuto . run2.sh
, y si exit
toca 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 echo
código aún se ejecutará ...
exit 0
para terminar la secuencia de comandos después del éxito, cuando ejecutas tu secuencia de comandos ej:./test.sh
deberías ver la salida pero tu consola permanecerá abierta.shell
comando, 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
return
lugar deexit
. Su propósito principal es regresar de una función de shell, pero si la usa dentro de unsource
script -d, regresa de ese script.Como dice §4.1 "Bourne Shell Builtins" del Manual de referencia de Bash :
fuente
return
SOLO se puede usar desde una función. Si lo usareturn
y lo ejecuta como un script de shell (psh run.sh
. Ej. ), Bash informará de un error:return: can only
devuelve 'desde una función o script de origen'return
eso 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.sh
obash run2.sh
Se 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:
exit
No se llamará a la línea con el comando cuando obtenga el script después delreturn
comando.Cuando ejecuta el script, el
return
comando 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
sh
para ejecutar una secuencia de comandos, por ejemplo,sh ./run2.sh
incluso 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
sh
ysource
?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/bash
utilizabash
para ejecutar el scriptTengo guiones con ambos tipos de shebang. Debido a esto, usar
sh
o.
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
sh
o.
(./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.sh
funciona. A lo sumo, podría necesitar./myscript.sh
.Es correcto que las secuencias de comandos de origen vs. ejecutadas usen
return
vs.exit
para 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.sh
o 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
/return
mientras 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 usarloreturn
y, segúnexit
corresponda.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 script
fuente
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
$0
y$BASH_SOURCE
y determinar siexit
pueden 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