Почему эта команда убивает мою оболочку?

41

Обновление: Это более общая команда, которая более воспроизводима. ShellFish определил, что существует более общий шаблон:

non-existingcommand & existingcommand &

например,

xyz & echo &

Кроме того, у меня был сотрудник, пытающийся подключиться к ssh-соединению, и его соединение было закрыто после запуска команды. Таким образом, это не ограничивается определенным эмулятором терминала.

Оригинальный вопрос:

echo?a=1&b=2|3&c=4=

Поведение:

После выполнения команды моя текущая вкладка Gnome Terminal закрывается без предупреждения.

Фон:

Мы тестировали URL-адрес с помощью команды curl, но забывали процитировать его или избегать специальных символов (следовательно, амперсанды и знаки равенства). Ожидая какой-то вздорности о проблемах с синтаксисом или не найденных командах, мы вместо этого смотрели, как наша оболочка просто уходит. Мы потратили некоторое время на сокращение команды до минимума, которая могла бы привести к поведению.

Мы используем терминал Gnome на Ubuntu 14.10. Как ни странно, поведения нет в другом ящике. У меня работает byobu, даже если я отсоединяюсь от сеанса. Это также не происходит на Cygwin. К сожалению, я ограничен тестированием с Ubuntu 14.10 в противном случае.

Примечание. Следующая команда также убивает мой терминал, но только примерно половину времени:

echo?a=1&b=2&c=3=

Дополнительные тесты:

Кто-то рекомендует использовать подоболочку...

guest-cvow8T@chortles:~$ bash -c 'echo?a=1&b=2|4&c=3='
bash: echo?a=1: command not found
guest-cvow8T@chortles:~$ bash: 4: command not found

Нет выхода.

  • 1
    Если вы запустите это в под-оболочке (то есть bash -c 'echo?a=1&b=2|3&c=4=' ), она выйдет? Печатает ли он какие-либо сообщения при выходе? Какую оболочку вы используете в gnome-terminal (Что выводит echo $SHELL ?)? Что set +o | grep errexit вывод?
  • 0
    Он не завершается при запуске с bash -x , если он хранится в скрипте, который есть. Это удивительно странное поведение!
Показать ещё 21 комментарий
Теги:

1 ответ

27
Лучший ответ

Я мог бы воспроизвести эту проблему в VM Ubuntu, но не на виртуальной машине OEL. Разница была в том, что на Ubuntu был установлен пакет command-not-found, и он предоставляет python script /usr/lib/command-not-found. Этот script отвечает за выход из оболочки.

В /etc/bash.bashrc существует функция command-not-found_handle, которая выполняет /usr/lib/command-not-found. Следовательно, терминал выходит, когда мы пытаемся выполнить такие команды. Когда я прокомментировал вызов /usr/lib/command-not-found, проблема больше не воспроизводилась.

Из моего /etc/bash.bashrc:

function command_not_found_handle {
     #check because c-n-f could've been removed in meantime 
     if [ -x /usr/lib/command-not-found ]; then 
          /usr/bin/python /usr/lib/command-not-found -- "$1"
          return $?
     elif [ -x /usr/share/command-not-founf/command-not-found ]; then
          /usr/bin/python /usr/share/command-not-founf/command-not-found -- "$1"
          return $?
     else
          printf "%s:command not found\n" "$1"
          return 127
     fi
}

  • 0
    Ух, отличная находка! Любая идея, почему сценарий заставляет оболочку иногда выходить?
  • 2
    Является ли этот фрагмент именно содержимым этой функции в файле /etc/bash.bashrc ? Потому что это плохо с отступом и синтаксически неверно.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню