Tengo una fuente bash de la run.sh
siguiente manera,
#!/bin/bash
if [ $# -ne 1 ]; then
exit
fi
...
cuando lo ejecuto de dos maneras, hay diferentes comportamientos. La primera forma es
source run.sh
Cerrará la terminal después de la ejecución. La segunda forma es
./run.sh
esto simplemente terminará de ejecutar el script y permanecerá en la terminal. Estoy preguntando si hay un comando para salir de un script bash para ambos source run.sh
y para la ./run.sh
ejecución. También lo he intentado return
, lo que no funciona bien en ./run.sh
ejecución.
En términos más generales, me interesa saber por qué sucede esto y cuál es la diferencia entre usar "fuente" y "". para la ejecución del script?
$- = *i*
?-
contiene los indicadores de opción actualmente activos. La prueba verifica si la-i
bandera está activa. Ver gnu.org/software/bash/manual/html_node/Special-Parameters.htmlPiense en el comando 'fuente' como en la declaración 'incluir'. Toma el contenido del argumento y lo ejecuta como si se ejecutara directamente. En este caso, su comando es 'fuente' con un argumento de 'run.sh' y run.sh se ejecuta exactamente como si hubiera escrito el contenido de run.sh en su línea de comando.
Cuando ejecuta './run.sh', './run.sh' es su comando y no tiene argumentos. Como este archivo es de texto plano y no binario, su shell busca un intérprete en shebang ('#!' En la primera línea) y encuentra '/ bin / bash'. Entonces su shell inicia una nueva instancia de bash y el contenido de run.sh se ejecuta dentro de esta nueva instancia.
En primera instancia, cuando bash alcanza el comando 'salir', se ejecuta exactamente como si lo hubiera escrito en la línea de comando. En las segundas instancias se ejecuta en el proceso bash que inició su shell, por lo que solo esta instancia de bash recibe un comando de 'salida'.
Cuando escribe una línea en bash, cualquier cosa antes del primer espacio se trata como un comando y todo lo que sigue se trata como argumentos. El comando '.' es un alias de 'fuente'. Cuando corres '. run.sh 'the'. ' es un comando en sí mismo ya que está separado de sus argumentos por un espacio. Cuando ejecuta './run.sh', su comando es './run.sh' y '.' es parte de la ruta relativa a run.sh con el '.' representando su carpeta actual.
fuente