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 || return
hace eso. Pero no quiero agregar || return
todas 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 errexit
en 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 || return
declaraciones 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 argument
El 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 || return
declaraciones 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
source
hace.fuente
source file || true
no hace esto, tampoco lo hacesource file || return
cuandoJills-MBP:~ jillr$ source ~/Desktop/site_builder/create.sh blah || true
simplemente 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 || return
declaraciones 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 || return
al final del archivo tampoco sería bueno.|| return
un 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 blah
para 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 file
desde 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 enbash
lugar desource
ejecutar el script y obtener los mismos resultados, pero solo cuando ejecuto mi script en un sub shell explícitamentepip install -r $apath/requirements.txt
dentro 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
bash
nuevo 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
source
comando,.
;source
es 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.sh
en el shell principal porque lo hago muy a menudo. Y necesito que llame a source $ create_path [argumento] para ejecutar el script.export
utilizando. 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.