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), las command || return
declaraciones están en el archivo que estoy ejecutando en el terminal