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 -e
ustawiłem gdzieś skrypt bash, z którego pochodzą moje terminale.
Sprawdziłem .bash_profile
/ .bashrc
/ .profile
i nie wygląda na set -e
to, że tam jest.
Czy pojawiliby się inni oczywisti sprawcy?
bash
shell-script
terminal
bashrc
Alexander Mills
źródło
źródło
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/etc
lub 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.PS4=' ${BASH_SOURCE}:$LINENO: ' bash -lixc true |& grep -e set -e trap
może być pouczający.-
tak:echo $-
.Odpowiedzi:
W porządku, więc rzeczywiście, był to krnąbrny,
set -e
który spowodował moje kłopoty.Sposób, w jaki znalazłem,
set -e
był 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 -e
plik znajdował się w pliku, który pobiera plik .bash_profile, ale linia nie była w samym pliku .bash_profile.źródło
source
twojej powłoki, to znacznie mniejszy zestaw niż tylko „losowe skrypty powłoki”.-e
może być przydatny w rzeczywistych skryptach, do sprawdzania głupich błędów. (Lub, aby upewnić się, że nie zapomnisz niczego sprawdzić).global set -e
, coset -e
wpływa tylko na skrypt zawierający$-
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 tolocal set -e
można go używać tylko w funkcji bash?Jeśli chcesz tylko do rozwiązania problemu, to
set +e
w twojej.bashrc
- na końcu.Możesz iść na kopanie - istnieje wiele innych miejsc, w których
set -e
może być - ale to wszystko załatwi.Jeśli jednak
set -e
jest częścią twojego,$PROMPT_COMMAND
powyższe nie będzie działać. Spróbujprintf '%s\n' "$PROMPT_COMMAND"
i zobacz, co jest w środku.źródło
printf '%s\n' "$PROMPT_COMMAND"
tylko białe znaki, nic tam nie ma$PROMPT_COMMAND
jest 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 .set +e
nie działa, być może dlatego, że był wcześniej naset -e
rozmowy w moim pozyskiwane plików bash.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!set +e
to oczywiście tylko pomoc dla zespołu, ale powiedziałeś, że