Sto cercando uno script bash nel terminale , quindi esco per errore con
set -o errexit
uccide il mio terminale, che è ESTREMAMENTE ANNOYING, perché devo chiudere il terminale, aprirne un altro e resettare alcune variabili.
Finora, usando
command || return
le righe, nella sceneggiatura, stanno facendo esattamente quello che voglio
set -o errexit
fare ... Ma lo voglio fatto per l'intera sceneggiatura; non solo una riga / comando
Ho un file pieno di comandi per la configurazione di un sito e preferirei non eseguire il comando || ritorno
per ogni singola riga nel file
C'è un'altra opzione impostata o qualcos'altro che "restituirà" invece di uscire dal terminale?
- Solo per chiarezza , mi piacerebbe uccidere lo script e lasciare il terminale nello stesso stato che premendo Ctrl + C per uccidere un servizio in esecuzione nel terminale. command || return
fa quello. Ma non voglio attaccare || return
ad ogni riga del file. Quindi sto cercando qualcosa di simile a set -o errexit
, che non causi l'arresto del terminale
--- Nota: creazione di uno script stupido con due righe (super.sh):
create_path=~/Desktop/site_builder/create.sh
source $create_path blah
E posizionandolo set -o errexit
nella parte superiore di create.sh,
funziona esattamente come me lo aspetto. Tuttavia, è davvero stupido dover creare un file con due righe, solo per chiamare un altro script bash, invece di chiamarlo semplicemente dal terminale. Ugghhh
ecco alcuni esempi:
in super.sh
#!/bin/bash
create_path=~/Desktop/site_builder/create.sh
source $create_path blah
in 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
nel terminal:
$ bash super.sh
uscita come previsto:
my-mac$
Questo funziona Che soluzione fastidiosa.
Io voglio , idealmente, di eseguire ciò che è nel file super.sh stupido dal terminale, non il file super.sh: D, senza avere la chiusura terminale su di me. Questo è ciò che accade con ciò che sto cercando di fare:
comando terminale:
my-mac$ source $create_path blah
in create.sh ho ancora set -o errexit
Ecco l'output sul terminale
sed: 1: "s/@@SITE_NAME@@/blah": unterminated substitute in regular expression
Saving session...
...copying shared history...
...saving history...truncating history files...
...completed.
[Process completed]
E poi il terminale è congelato. Ctrl + C non funziona, né Ctrl + D
Se invece di set -o errexit
, se uso semplicemente command || return
istruzioni ovunque nel file create.sh, ottengo esattamente quello che voglio, mentre eseguo le righe in supser.sh direttamente sul terminale (invece di chiamare super.sh dal terminale). Ma questa non è nemmeno una soluzione pratica.
Nota: mi è piaciuta la risposta di @terdon circa la generazione di una shell figlio, quindi ho finito per generare una sub shell tramite lo script anziché il terminale, come ha mostrato nella sua risposta usando le parentesi graffe ( )
, attorno all'intero script. La sua risposta funziona anche.
source $file_path argument
Lo script viene eseguito nella stessa shell da cui l'ho chiamato da (cosa source
fa, mi è stato detto ... e si comporta in questo modo) le command || return
istruzioni si trovano nel file che sto eseguendo nel terminale