Estoy buscando un script bash en la terminal , así que salgo por error con
set -o errexit
mata mi terminal, lo cual es EXTREMADAMENTE molesto, porque tengo que cerrar la terminal, abrir otra y restablecer algunas variables.
Hasta ahora, usando
command || return
líneas, en el guión, está haciendo exactamente lo que quiero
set -o errexit
hacer ... Pero quiero que se haga para todo el guión; no solo una línea / comando
Tengo un archivo lleno de comandos para configurar un sitio, y prefiero no ejecutar comandos || regreso
por cada línea en el archivo
¿Hay otra opción establecida, o algo más que simplemente "regrese" en lugar de salir del terminal?
- Solo por claridad , me gustaría matar el script y dejar el terminal en el mismo estado que presionar ctrl + C para matar un servicio que se ejecuta en el terminal. command || returnhace eso. Pero no quiero agregar || returntodas las líneas del archivo. Así que estoy buscando algo similar set -o errexit, que no provoque que el terminal se apague
--- Nota: Crear un script tonto con dos líneas (super.sh):
create_path=~/Desktop/site_builder/create.sh
source $create_path blah
Y colocando set -o errexiten la parte superior de create.sh,
funciona exactamente como lo espero. Sin embargo, es realmente estúpido tener que crear un archivo con dos líneas, solo para llamar a otro script bash, en lugar de simplemente llamarlo desde la terminal. Ughhhh
Aquí hay algunos ejemplos:
en super.sh
#!/bin/bash
create_path=~/Desktop/site_builder/create.sh
source $create_path blah
en create.sh
#!/bin/bash
set -o errexit
#line below this is a line that fails and will cause the script to stop and return to the terminal as expected
sed "s/@@SITE_NAME@@/$dirname"
~/Desktop/site_builder/template_files/base.html > ~/Desktop/$dirname/templates/base.html # a line with a stupid error
en la terminal:
$ bash super.sh
salida como se esperaba:
my-mac$
Esto funciona. Qué solución tan molesta.
Yo quiero , a ser posible, para ejecutar lo que hay en el archivo super.sh estúpida de la terminal, no el archivo super.sh: D, sin tener cerrada la terminal de abajo en mí. Esto es lo que sucede con lo que intento hacer:
comando terminal:
my-mac$ source $create_path blah
en create.sh todavía tengo set -o errexit
Aquí está la salida en la terminal
sed: 1: "s/@@SITE_NAME@@/blah": unterminated substitute in regular expression
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
[Process completed]
Y luego la terminal se congela. Ctrl + C no funciona, tampoco Ctrl + D
Si en lugar de set -o errexit, si solo uso command || returndeclaraciones en todas partes en el archivo create.sh, obtengo exactamente lo que quiero, mientras ejecuto las líneas en supser.sh directamente en el terminal (en lugar de llamar a super.sh desde el terminal). Pero esa tampoco es una solución práctica.
Nota: Me gustó la respuesta de @terdon sobre solo generar un shell secundario, así que terminé generando un sub shell a través del script en lugar del terminal, como lo mostró en su respuesta usando los corchetes ( ), alrededor del script completo. Su respuesta también funciona

source $file_path argumentEl script se está ejecutando en el mismo shell desde el que lo llamé (quésource, me han dicho ... y actúa como si fuera el caso), lascommand || returndeclaraciones están en el archivo que estoy ejecutando en el terminalRespuestas:
Simplemente obtenga el archivo con una prueba de fallos:
... entonces el comando general no fallará, incluso si lo
sourcehace.fuente
source file || trueno hace esto, tampoco lo hacesource file || returncuandoJills-MBP:~ jillr$ source ~/Desktop/site_builder/create.sh blah || truesimplemente ejecuta la siguiente parte del script en caso de error, por lo que regresa en lugar de verdadero. Lo único que ha funcionado son lascommand || returndeclaraciones en el archivo real para todos los comandos, lo cual es una tontería. No sé si incluirlo todo en una función y luego llamarfunction || returnal final del archivo tampoco sería bueno.|| returnun comando que falla, el sí, volverá. ¿Pensé que estábamos tratando de evitar que su shell principal / principal salga?Esto es lo único que funciona para lo que necesitaba lograr (crear un entorno virtual y luego activarlo, luego instalar los requisitos de un script bash):
generar un shell subshell / hijo del script, como en:
stupid_file.sh
ejecuta el archivo stupid_file usando:
EL FIN.
** hace una reverencia **
(el crédito va para Jeff y Terdon)
fuente
bash $create_path blahpara ver si aún sale, y se ejecuta de la misma manera, y aún instala cosas en mi entorno virtual correctamente. Fuera de tiempo ahora.(...), ya que todas las asignaciones entre paréntesis solo afectan esa subshell.foo=3; (foo=5); echo "$foo"es la salida 3, 5. Nosource filedesde la terminal y esperar los mismos resultados. Porque eso nunca funcionó. La única vez que obtengo los mismos resultados es cuando creo un sub shell explícitamente, ya sea a través del terminal o desde el script. Sin embargo, puedo usar enbashlugar desourceejecutar el script y obtener los mismos resultados, pero solo cuando ejecuto mi script en un sub shell explícitamentepip install -r $apath/requirements.txtdentro de ese entorno activado. Es por eso que usé source en primer lugar para llamar al scriptComo una solución alternativa simple, puede ejecutar un shell en su shell actual y fuente allí. Algo como:
Abra una nueva terminal y configure todo como lo desee. Usted mencionó algunas variables de entorno y similares. Ponlos aquí.
En esa terminal, inicie un nuevo shell. Por ejemplo,
bash.Haz tus cosas. Busca tu guión. Si sale, acaba de ser arrojado al primer shell y todo está configurado. Solo corre de
bashnuevo y estarás de vuelta en el negocio.Para ilustrar, creé este script que fallará si intentas obtenerlo:
Veamos lo que sucede si comienzo a una sesión de shell anidada y luego la fuente él (nota que estoy usando el nombre portátil para el
sourcecomando,.;sourcees una del bash):Como puede ver, el error de sintaxis hizo que la secuencia de comandos de origen saliera, lo que a su vez hizo que mi sesión de shell se cerrara, pero dado que era una sesión anidada, eso me devolvió al shell principal original con todas las variables aún configuradas . Ahora, simplemente ejecute un nuevo shell nuevamente y puede volver a obtener su script.
fuente
create_path=~/Desktop/site_builder/create.shen el shell principal porque lo hago muy a menudo. Y necesito que llame a source $ create_path [argumento] para ejecutar el script.exportutilizando. Pero lo que describe realmente tiene muy poco sentido. Suena cada vez más como un problema XY . Es posible que desee publicar una nueva pregunta que explique cuál es su objetivo final. Apuesto a que podemos darle una mejor solución que todas estas fuentes extrañas.