shell – Llame a un script para otro script, pero no salga del padre si el hijo llama a exit

Pregunta:

first.sh :

#! /bin/ksh
echo "prova"
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
echo "ho lanciato il terzo"

second.sh :

echo "sono nel secondo script"
dosomething1
exit $?

Si second.sh detecta un error y sale con el estado -9, first.sh sale siempre. ¿Cómo puedo evitar salir del primer shell si sale el shell secundario?

No puedo editar second.sh .

Respuesta:

Lo que estamos haciendo aquí es que incluye second.sh y third.sh como sub-secuencias de comandos que se ejecutan en el mismo proceso, que se denomina “abastecimiento” en la programación de shell. . ./second.sh es básicamente equivalente a incluir el texto de second.sh en ese punto. El comando de exit sale del proceso, no importa si lo llama en el script original o en un script de origen.

Si todo lo que quiere hacer es ejecutar los comandos en second.sh y third.sh y ellos no tienen que acceder o modificar las variables y funciones de la escritura original, llamar a estos scripts como procesos secundarios.

#! /bin/ksh
echo "prova"
./second.sh
echo "ho lanciato il secondo"
./third.sh
echo "ho lanciato il terzo"

Si necesita que los otros scripts accedan a las variables y funciones del script original, pero no los modifique, llame a estos scripts en subcapas. Las subcapas son procesos separados, por lo que la exit solo las exit .

#! /bin/ksh
echo "prova"
(. ./second.sh)
echo "ho lanciato il secondo"
(. ./third.sh)
echo "ho lanciato il terzo"

Si es necesario utilizar variables o funciones definidas en second.sh y third.sh en la escritura matriz, entonces usted necesita para mantener abastecimiento de ellos.

El return incorporado sale solo del script de origen y no de todo el proceso; esa es una de las pocas diferencias entre incluir otro script con . comando e incluir su texto en el script principal. Si los scripts de origen solo llaman a exit en el nivel superior, a diferencia de las funciones internas, entonces puede cambiar exit a return . Puede hacerlo sin modificar el script utilizando un alias.

#! /bin/ksh
echo "prova"
alias exit=return
. ./second.sh
echo "ho lanciato il secondo"
. ./third.sh
unalias exit
echo "ho lanciato il terzo"

Si la exit también se llama funciones internas, no creo que haya una forma que no sea engorrosa. Una forma complicada es establecer una trampa de salida y poner su código allí.

#!/bin/ksh
do_first () {
  echo "prova"
  trap "after_second" EXIT
  . ./second.sh
  after_second
}
after_second () {
  echo "ho lanciato il secondo"
  trap "after_third" EXIT
  . ./third.sh
  after_third
}
after_third () {
  trap - EXIT
  echo "ho lanciato il terzo"
}
do_first

Leave a Comment

Your email address will not be published. Required fields are marked *

web tasarım