Любая команда в моем терминале, которая выходит с ненулевым кодом, закрывает мое окно терминала

22

Сначала это было немного забавно, как играть в "Bash Roulette" ... но теперь это стареет

Любая команда в моем терминале, которая выходит с ненулевым кодом, закрывает мое окно терминала

Мне сказали, что, возможно, я где-то set -eустановил сценарий bash, который является источником моего терминала.

Я проверил .bash_profile/ .bashrc/, .profileи это не похоже set -eна там.

Будут ли другие очевидные виновники?

Александр Миллс
источник
7
Выполнить set +e, это исправить проблему? Если это так, что я предполагаю, то вам нужно продолжать искать это set -e. Это может быть в глобальных версиях этих файлов /etcили в любом другом скрипте, полученном из них. Отодвиньте свои файлы конфигурации, если проблема устранена, затем добавьте строки меньшими порциями, чтобы увидеть, где они ломаются.
egmont
3
PS4=' ${BASH_SOURCE}:$LINENO: ' bash -lixc true |& grep -e set -e trapможет быть информативным.
Муру
Вы можете проверить набор флагов включенных в настоящее время оболочки со специальной переменной -типа так: echo $-.
Дэвид Фёрстер

Ответы:

21

Хорошо, действительно, это был странный поступок, set -eкоторый вызвал мою проблему.

То, как я нашел, set -eиспользовалоbash -lx

Лучше всего использовать:

bash -lx > lx.log 2>&1

затем откройте этот файл журнала и выполните поиск set...

как только вы найдете это своенравным, set -eвы можете удалить эту линию, и ваша проблема должна исчезнуть! (Перезагрузка машины может быть хорошей идеей).

В моем случае set -eфайл находился в источнике .bash_profile, но строка не была в самом файле .bash_profile.

Александр Миллс
источник
3
Вещи, которые безопасны sourceв вашей оболочке, намного меньше, чем просто «случайные сценарии оболочки». -eможет быть полезен в реальных сценариях, для проверки глупых ошибок. (Или чтобы убедиться, что вы ничего не забыли проверить на ошибки.)
Питер Кордес,
Видимо, это так ... я хотел бы, global set -eчтобы что- то подобное было так, чтобы это set -e
Александр Миллс
@AlexanderMills, чтобы сделать это, вы можете проверить, $-чтобы проверить флаг во внутреннем скрипте и восстановить его состояние в конце, или просто сбросить его в главном скрипте, если вы знаете, что у вас есть скрипты с исходным кодом, которые его
установят
Так что, я думаю, local set -eможно было использовать только функцию bash?
Александр Миллс
13

Если вы просто хотите решить проблему, включите set +eв свой .bashrc- в конце.

Вы можете копать - есть много других мест, где set -eможет быть, - но это позаботится обо всем.

Если, однако, set -eявляется частью вашего, $PROMPT_COMMANDто выше не будет работать. Попробуйте printf '%s\n' "$PROMPT_COMMAND"и посмотрите, что в этом.

Wildcard
источник
на моей машине, когда я открываю терминал, получаю printf '%s\n' "$PROMPT_COMMAND"только пробел, ничего нет
Александр Миллс
@AlexanderMills, тогда не в этом твоя проблема. Одним из распространенных применений $PROMPT_COMMANDявляется обновление имени вкладки терминала или окна; MacOS X и Ubuntu оба делают это. См. Apple.stackexchange.com/q/220641/151730 для информации об этом для Mac.
Wildcard
Я нашел ответ на вопрос и добавил свой собственный ответ, set +eне сделал работу, возможно , потому , что это было до того на set -eвызове в моем Sourced Баш файлов.
Александр Миллс
1
@AlexanderMills, да, я думал, что это неявно. Я хотел добавить set +e к твоему .bashrc, а не вставлять его в самом начале. Я сделал это в своем ответе прямо сейчас. Хорошо, что вы нашли источник!
Wildcard
Да, set +eочевидно , это просто пластырь, но вы заявили, что
Александр Миллс