Вопрос или проблема
Я ожидаю, что за это меня раскритиковали, но я не могу найти ответ нигде. Похоже, это должно быть так очевидно. Иногда, когда я вводю неверную команду в терминале bash, курсор просто перескакивает на следующую строку без каких-либо ошибок. Я не могу понять, что я сделал неправильно. Это как будто я застрял в программе. Воссоздание:
$ tidy
Я: “Упс! Это не то, что я хотел ввести…”
:q
Я: “Это не сработало…”
:exit
:quit
exit
quit
/exit
/quit
-exit
-quit
-wtf???
Я знаю, что ошибся, но как мне вернуться к приглашению без закрытия терминала?
Вы всегда можете попробовать очевидные вещи, такие как ^C
, ^D
(eof), Escape и т. д., но если все не сработает, я обычно заканчиваю приостановлением команды с помощью ^Z
(Control-Z), что возвращает меня в оболочку.
Затем я выполняю команду ps
и запоминаю PID (идентификатор процесса) команды, а затем даю команду kill thePID
(kill -9 thePID
, если первое не сработало), чтобы завершить приложение.
Обратите внимание, что это не аккуратный (без игры слов) способ завершить приложение/команду, и вы рискуете, возможно, не сохранить некоторые данные и т. д.
Пример (я бы использовал tidy
, но у меня он не установлен):
$ gnuplot
G N U P L O T
Версия 4.2 патч 6
....
Отправляйте отчеты о ошибках и предложения на <http://sourceforge.net/projects/gnuplot>
Тип терминала установлен на 'wxt'
gnuplot>
gnuplot> ##### нажал ^Z здесь
[1]+ Остановлено gnuplot
$ ps
PID TTY TIME CMD
1681 pts/1 00:00:00 tcsh
1690 pts/1 00:00:00 bash
1708 pts/1 00:00:00 gnuplot
1709 pts/1 00:00:00 ps
$ kill 1708 ###### не убил команду, как показывает ps
$ ps
PID TTY TIME CMD
1681 pts/1 00:00:00 tcsh
1690 pts/1 00:00:00 bash
1708 pts/1 00:00:00 gnuplot
1710 pts/1 00:00:00 ps
$ kill -9 1708 ### -9 решил проблему
$
[1]+ Убито gnuplot
$ ps
PID TTY TIME CMD
1681 pts/1 00:00:00 tcsh
1690 pts/1 00:00:00 bash
1711 pts/1 00:00:00 ps
Попробуйте нажать Ctrl–D или Ctrl–C. Если не сработает, убейте процесс.
Попробовав команду tidy
, о которой вы упомянули, Ctrl–D работает.
Еще одно решение (не упомянуто ранее) – отправить сигнал SIGQUIT
, используя ctrl+\
Это сильнее чем ctrl+c
CTRL+D == Конец файла
и
CTRL+C == завершить текущий процесс, конечно, может быть, данное программное обеспечение обработает это и
CTRL+D не сработает
Конечно, они создают сигнал ядра
, если вы хотите узнать больше, читайте :
man 7 signal
Ответ или решение
Когда вы столкнулись с проблемой выполнения неверной команды в терминале Bash, и курсор просто переходит на новую строку без какого-либо сообщения об ошибке, это может вызвать замешательство. Вот подробное руководство о том, как выйти или отменить неудачную команду:
Пошаговое руководство по завершению неудачной команды в Bash
-
Используйте сочетания клавиш для завершения процесса:
-
Ctrl + C: Это наиболее распространенный способ остановить текущий запущенный процесс в терминале. Вызывает сигнал
SIGINT
, что приводит к прерыванию текущей операции. Это то, что вы должны попробовать в первую очередь. -
Ctrl + D: Это комбинация вызывает сигнал "конец файла" (EOF). Если процесс правильно обработал этот сигнал, он завершится. Однако не все команды могут корректно реагировать на этот сигнал.
-
Ctrl + \: Это сочетание отправляет сигнал
SIGQUIT
, который является более сильным по сравнению сSIGINT
. Этот сигнал обычно используется для завершения программ, которые не реагируют наCtrl + C
.
-
-
Приостановка процесса:
Если указанные выше команды не сработали, вы можете приостановить процесс и вернуть управление терминалу:
- Ctrl + Z: Это сочетание помещает текущий процесс в фоновый режим и останавливает его выполнение. После этого вы можете получить доступ к оболочке.
-
Убив процесс:
После приостановки вы можете узнать идентификатор процесса (PID) с помощью команды:
ps
В выводе вы найдете список всех процессов, запущенных в текущем сеансе. Найдите PID вашего зависшего процесса.
Затем выполните:
kill thePID
Если обычное завершение с помощью
kill
не сработало, можно использовать:kill -9 thePID
Здесь
-9
дает более сильный сигналSIGKILL
, который принудительно завершает процесс. Однако следует быть осторожным, так как это может привести к потере несохраненных данных.
Замечания по поводу команд:
-
Если вы всё еще не уверены, что происходит, и не можете определить, какую именно команду вы запустили, полезно знать, что многие программы имеют собственные подсистемы или интерфейсы командной строки. Например, в случае, если вы запустили текстовый редактор, такой как
vim
, вы можете находиться в режиме редактирования, и для выхода нужно выполнить определённые команды (например,:q
или:wq
для выхода с сохранением). -
Если выбранный вами инструмент не выходит, подумайте о возможности использования системного монитора (например,
htop
илиtop
), чтобы визуально идентифицировать и управлять процессами.
Заключение
Поиск способа выхода из зависшей программы или отмены неудачной команды может быть сложным, но в большинстве случаев он решается с помощью стандартных сочетаний клавиш и команд Bash. Следуйте представленным рекомендациям, и вы сможете эффективно управлять процессами в терминале.