Будь-яка команда в моєму терміналі, що виходить із ненульовим кодом, закриває вікно мого терміналу


22

Спочатку це було трохи смішно, як грати в "Баш-рулетку" ... але тепер вона старіє лол

Будь-яка команда в моєму терміналі, що виходить із ненульовим кодом, закриває вікно мого терміналу

Мені сказали, що, можливо, я set -eвстановив десь у баш скрипті, де джерела мого терміналу.

Я перевірив .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, для цього ви можете перевірити, $-чи перевірити прапор у внутрішньому сценарії та відновити його стан наприкінці, або просто скинути його в основний сценарій, якщо ви знаєте, що ви знайшли скрипти, які його встановили
ilkkachu

Тож я здогадуюсь, що він local set -eможе бути використаний лише у функції bash?
Олександр Міллз

13

Якщо ви просто хочете вирішити проблему, включіть set +eу своє .bashrc- наприкінці.

Ви можете копатись - є багато інших місць, де це set -eможе бути - але це подбає про долю.

Якщо, однак, set -eє частиною вашого, $PROMPT_COMMANDтоді вищезгадане не вийде. Спробуйте printf '%s\n' "$PROMPT_COMMAND"і подивіться, що в ньому.


на моїй машині, коли я відкриваю термінал, printf '%s\n' "$PROMPT_COMMAND"дає просто пробіл, там нічого
Олександр Міллз

@AlexanderMills, то це не є вашою проблемою. Одне поширене використання для $PROMPT_COMMANDоновлення назви вкладки терміналу або імені вікна; Це роблять і MacOS X, і Ubuntu. Інформацію про це для Mac див. У програмі apple.stackexchange.com/q/220641/151730 .
Wildcard

Я знайшов відповідь на питання і додав свою власну відповідь, set +eне зробив роботу, можливо , тому , що це було до того на set -eвиклик у моїй Sourced Баш файлів.
Олександр Міллз

1
@AlexanderMills, так, я вважав, що це неявно. Я мав намір долучитись set +e до вашого .bashrc, а не ставити його на початку. Я це явно зробив у своїй відповіді. Добре, що ви знайшли джерело!
Wildcard

Так, set +eочевидно , це лише допомога, але ви це заявили
Олександр Міллз
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.