Każde polecenie w moim terminalu, które wychodzi z niezerowym kodem, zamyka okno mojego terminalu

22

Na początku było to trochę zabawne, jak granie w „Bash Roulette” ... ale teraz robi się stary Lol

Każde polecenie w moim terminalu, które wychodzi z niezerowym kodem, zamyka okno mojego terminalu

Powiedziano mi, że być może set -eustawiłem gdzieś skrypt bash, z którego pochodzą moje terminale.

Sprawdziłem .bash_profile/ .bashrc/ .profilei nie wygląda na set -eto, że tam jest.

Czy pojawiliby się inni oczywisti sprawcy?

Alexander Mills
źródło
7
Wykonaj a set +e, czy to naprawia problem? Jeśli tak, to zakładam, że musisz tego szukać set -e. Może być w globalnych wersjach tych plików w /etclub w dowolnym innym skrypcie pochodzącym od nich. Przenieś pliki konfiguracyjne, jeśli problem zostanie rozwiązany, dodaj z powrotem wiersze w mniejszych porcjach, aby zobaczyć, gdzie się psuje.
egmont
3
PS4=' ${BASH_SOURCE}:$LINENO: ' bash -lixc true |& grep -e set -e trapmoże być pouczający.
mur
Można sprawdzić zestaw aktualnie włączone flagi powłoki ze specjalnej zmiennej -tak: echo $-.
David Foerster

Odpowiedzi:

21

W porządku, więc rzeczywiście, był to krnąbrny, set -ektóry spowodował moje kłopoty.

Sposób, w jaki znalazłem, set -ebył używanybash -lx

Najlepiej jest użyć:

bash -lx > lx.log 2>&1

następnie otwórz ten plik dziennika i wyszukaj set...

gdy znajdziesz tę krnąbrną drogę set -e, możesz usunąć tę linię, a twój problem powinien zniknąć! (Ponowne uruchomienie maszyny może być dobrym pomysłem).

W moim przypadku set -eplik znajdował się w pliku, który pobiera plik .bash_profile, ale linia nie była w samym pliku .bash_profile.

Alexander Mills
źródło
3
Rzeczy, które są bezpieczne dla sourcetwojej powłoki, to znacznie mniejszy zestaw niż tylko „losowe skrypty powłoki”. -emoże być przydatny w rzeczywistych skryptach, do sprawdzania głupich błędów. (Lub, aby upewnić się, że nie zapomnisz niczego sprawdzić).
Peter Cordes
Najwyraźniej tak jest ... chciałbym, żeby było coś takiego global set -e, co set -ewpływa tylko na skrypt zawierający
Alexander Mills,
@AlexanderMills, aby to zrobić, możesz sprawdzić $-flagę w skrypcie wewnętrznym i przywrócić jej stan na końcu, lub po prostu zresetować go w skrypcie głównym, jeśli wiesz, że masz skrypty, które by to
ustawiły
Więc chyba local set -emożna go używać tylko w funkcji bash?
Alexander Mills,
13

Jeśli chcesz tylko do rozwiązania problemu, to set +ew twojej .bashrc- na końcu.

Możesz iść na kopanie - istnieje wiele innych miejsc, w których set -emoże być - ale to wszystko załatwi.

Jeśli jednak set -ejest częścią twojego, $PROMPT_COMMANDpowyższe nie będzie działać. Spróbuj printf '%s\n' "$PROMPT_COMMAND"i zobacz, co jest w środku.

Dzika karta
źródło
na moim komputerze, kiedy otwieram terminal, wyświetla printf '%s\n' "$PROMPT_COMMAND"tylko białe znaki, nic tam nie ma
Alexander Mills,
@AlexanderMills, to nie jest twój problem. Jednym z powszechnych zastosowań $PROMPT_COMMANDjest aktualizacja nazwy karty terminala lub nazwy okna; MacOS X i Ubuntu to robią. Dane na ten temat dla komputerów Mac można znaleźć na stronie apple.stackexchange.com/q/220641/151730 .
Wildcard
Znalazłem odpowiedź na problem i dodać własną odpowiedź, set +enie działa, być może dlatego, że był wcześniej na set -erozmowy w moim pozyskiwane plików bash.
Alexander Mills,
1
@AlexanderMills, tak, myślałem, że to dorozumiane. Chciałem dołączyć set +e do ciebie .bashrc, a nie wstawiać na początku. Wyraziłem to wyraźnie w mojej odpowiedzi. Dobrze, że znalazłeś źródło!
Wildcard
Tak, set +eto oczywiście tylko pomoc dla zespołu, ale powiedziałeś, że
Alexander Mills