scripts script programas programar programacion espaƱol ejemplos comandos comando linux bash

programas - script linux ejemplos



Cualquier forma de salir del script bash, pero sin abandonar el terminal (9)

Cuando uso el comando exit en un script de shell, el script terminará el terminal (el prompt). ¿Hay alguna forma de terminar un script y luego permanecer en el terminal?

Se espera que mi script run.sh se ejecute directamente, o que provenga 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 código en run.sh , quiero que se detenga en la terminal y permanezca allí. Pero al usar la exit , toda la terminal se cierra.

PD: he intentado usar return , pero echo código de echo se ejecutará ...


1) la salida 0 saldrá del script si es exitosa.

2) la salida 1 saldrá del script si es un error.

Puede probar estos dos arriba en función de su necesidad.


Creo que esto sucede porque lo está ejecutando en modo fuente con el punto

. myscript.sh

Deberías ejecutar eso en una subshell:

/full/path/to/script/myscript.sh

''fuente'' http://ss64.com/bash/source.html


El "problema" realmente es que estás buscando y no estás ejecutando el guión. Cuando obtienes un archivo, su contenido se ejecutará en el shell actual, en lugar de generar una subshell. Entonces, todo, incluida la salida, afectará el shell actual.

En lugar de usar exit , querrá usar return .


En lugar de ejecutar el código usando . run2.sh puede ejecutar el script usando sh run2.sh o bash run2.sh
Se abrirá una nueva instancia para ejecutar el script y luego se cerrará al final del script, dejando el otro shell abierto. `


Es correcto que los scripts de origen frente a los ejecutados utilicen return vs. exit para mantener abierta la misma sesión, como han notado otros.

Aquí hay un consejo relacionado, si alguna vez quiere una secuencia de comandos que debe mantener la sesión abierta, independientemente de si es fuente o no.

El siguiente ejemplo se puede ejecutar directamente como foo.sh o como fuente . foo.sh . 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 guión externo.

#!/bin/sh foo(){ read -p "Would you like to XYZ? (Y/N): " response; [ $response != ''y'' ] && return 1; echo "XYZ complete (args $@)."; return 0; echo "This line will never execute."; } foo "$@";

Resultado terminal:

$ foo.sh
$ ¿Te gustaría XYZ? (S / N): n
ps foo.sh
$ ¿Te gustaría XYZ? (S / N): n
$ |
(la ventana del terminal permanece abierta y acepta entradas adicionales)

Esto puede ser útil para probar rápidamente los cambios de scripts en un solo terminal mientras mantiene un montón de código de desecho debajo de la exit / return principal 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 pueden o no ser llamados de diferentes maneras), aunque es mucho menos complicado usar el return y la exit cuando corresponda.


Esto es como poner una función de ejecución dentro de la secuencia de comandos run2.sh. Usas el código de salida dentro de la ejecución mientras fuente tu archivo run2.sh en el bash tty. Si le da a la función ejecutar su poder para salir de su secuencia de comandos y le da a la run2.sh su poder para salir del terminador. Luego de primo la función de ejecución tiene la potencia para salir de su teminador.

#! /bin/sh # use . run2.sh run() { echo "this is run" #return 0 exit 0 } echo "this is begin" run echo "this is end"

De todos modos, apruebo con Kaz que es un problema de diseño.


Sí; puede usar return lugar de exit Su objetivo principal es regresar de una función de shell, pero si lo usa dentro de un script de source -d, regresa de ese script.

Como lo indica el §4.1 "Bourne Shell Builtins" del Manual de referencia de Bash :

return [n]

Hace que una función de shell salga con el valor de retorno n . Si n no se proporciona, el valor de retorno es el estado de salida del último comando ejecutado en la función. Esto también se puede usar para terminar la ejecución de un script que se está ejecutando con . (o source ) incorporada, devolviendo n o el estado de salida del último comando ejecutado dentro del script como el estado de salida del script. Cualquier comando asociado con la captura RETURN se ejecuta antes de que se reanude la ejecución después de la función o la secuencia de comandos. El estado de retorno no es cero si el return se usa fuera de una función y no durante la ejecución de un script por . o source


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 el origen no crea otro proceso (instancia).


si su emulador de terminal no tiene, puede desinfectar un script de origen y mantener el terminal con:

#!/bin/sh sed "s/exit/return/g" script >/tmp/script . /tmp/script read

de lo contrario, puede usar $TERM -hold -e script