Qualsiasi comando nel mio terminale che esce con un codice diverso da zero chiude la finestra del mio terminale


22

All'inizio è stato un po 'divertente, come giocare a "Bash Roulette" ... ma ora sta diventando vecchio

Qualsiasi comando nel mio terminale che esce con un codice diverso da zero chiude la finestra del mio terminale

Mi è stato detto che forse ho set -eimpostato un po 'di script bash da qualche parte che il mio terminale genera.

Ho controllato .bash_profile/ .bashrc/ .profilee non sembra che set -eci sia.

Ci sarebbero altri colpevoli evidenti?


7
Esegui a set +e, ripara il problema? Se è così, cosa che presumo, allora devi continuare a cercarlo set -e. Potrebbe trovarsi nelle versioni globali di questi file /etco in qualsiasi altro script proveniente da essi. Allontana i file di configurazione, se il problema è stato risolto, aggiungi nuovamente le righe in blocchi più piccoli per vedere dove si interrompe.
egmont,

3
PS4=' ${BASH_SOURCE}:$LINENO: ' bash -lixc true |& grep -e set -e trappotrebbe essere informativo.
muru,

È possibile controllare la serie di bandiere di shell attualmente abilitati con la variabile speciale -in questo modo: echo $-.
David Foerster,

Risposte:


21

Bene, quindi davvero, è stato un ribelle set -eche mi ha causato problemi.

Il modo in cui ho trovato il set -estava usandobash -lx

La cosa migliore da fare sarebbe usare:

bash -lx > lx.log 2>&1

quindi apri quel file di registro ed esegui una ricerca per set...

una volta trovato così ribelle set -epuoi rimuovere quella linea e il tuo problema dovrebbe essere risolto! (Il riavvio della macchina potrebbe essere una buona idea).

Nel mio caso, set -ec'era in un file che ha origine .bash_profile, ma la linea non era in .bash_profile stesso.


3
Le cose che sono sicure sourcenella tua shell sono un set molto più piccolo dei semplici "script di shell casuali". -epuò essere utile negli script reali, per il controllo degli errori muti. (O per essere sicuro di non aver dimenticato di controllare qualsiasi cosa.)
Peter Cordes,

Apparentemente è così ... Vorrei che ci fosse qualcosa del genere global set -eche set -einfluenza solo la sceneggiatura contenitiva
Alexander Mills,

@AlexanderMills, per farlo, puoi controllare $-per controllare la bandiera nello script interno e ripristinarne lo stato alla fine, o semplicemente ripristinarlo nello script principale se sai che hai script di provenienza che lo imposteranno
ilkkachu

Quindi suppongo che local set -epotrebbe essere usato solo in una funzione bash?
Alexander Mills,

13

Se vuoi solo risolvere il problema, includilo set +enel tuo .bashrc- alla fine.

Puoi andare a scavare — ci sono molti altri posti dove set -epotrebbe esserci un — ma questo si occuperà del lotto.

Se, tuttavia, set -efa parte del tuo, $PROMPT_COMMANDquanto sopra non funzionerà. Prova a printf '%s\n' "$PROMPT_COMMAND"vedere cosa c'è dentro.


sulla mia macchina, quando apro un terminale, printf '%s\n' "$PROMPT_COMMAND"produce solo spazio, niente lì
Alexander Mills,

@AlexanderMills, non è questo il tuo problema. Un uso comune per $PROMPT_COMMANDè aggiornare il nome della scheda del terminale o il nome della finestra; MacOS X e Ubuntu lo fanno entrambi. Vedi apple.stackexchange.com/q/220641/151730 per i dati su questo per Mac.
Carattere jolly

Ho trovato una risposta al problema e ho aggiunto la mia risposta, set +enon ha funzionato, forse perché era prima della set -echiamata nei miei file bash di provenienza.
Alexander Mills,

1
@AlexanderMills, sì, ho pensato che fosse implicito. Volevo aggiungere set +e al tuo .bashrc, non inserirlo all'inizio. L'ho reso esplicito nella mia risposta ora. Bene che hai trovato la fonte!
Wildcard il

Sì, set +eovviamente è solo un cerotto, ma hai affermato che
Alexander Mills,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.