Как выйти или отменить неправильную команду bash?

Вопрос или проблема

Я ожидаю, что за это меня раскритиковали, но я не могу найти ответ нигде. Похоже, это должно быть так очевидно. Иногда, когда я вводю неверную команду в терминале 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

Попробуйте нажать CtrlD или CtrlC. Если не сработает, убейте процесс.

Попробовав команду tidy, о которой вы упомянули, CtrlD работает.

Еще одно решение (не упомянуто ранее) – отправить сигнал SIGQUIT, используя ctrl+\

Это сильнее чем ctrl+c

CTRL+D == Конец файла

и

CTRL+C == завершить текущий процесс, конечно, может быть, данное программное обеспечение обработает это и CTRL+D не сработает

Конечно, они создают сигнал ядра, если вы хотите узнать больше, читайте :

man 7 signal

Ответ или решение

Когда вы столкнулись с проблемой выполнения неверной команды в терминале Bash, и курсор просто переходит на новую строку без какого-либо сообщения об ошибке, это может вызвать замешательство. Вот подробное руководство о том, как выйти или отменить неудачную команду:

Пошаговое руководство по завершению неудачной команды в Bash

  1. Используйте сочетания клавиш для завершения процесса:

    • Ctrl + C: Это наиболее распространенный способ остановить текущий запущенный процесс в терминале. Вызывает сигнал SIGINT, что приводит к прерыванию текущей операции. Это то, что вы должны попробовать в первую очередь.

    • Ctrl + D: Это комбинация вызывает сигнал "конец файла" (EOF). Если процесс правильно обработал этот сигнал, он завершится. Однако не все команды могут корректно реагировать на этот сигнал.

    • Ctrl + \: Это сочетание отправляет сигнал SIGQUIT, который является более сильным по сравнению с SIGINT. Этот сигнал обычно используется для завершения программ, которые не реагируют на Ctrl + C.

  2. Приостановка процесса:

    Если указанные выше команды не сработали, вы можете приостановить процесс и вернуть управление терминалу:

    • Ctrl + Z: Это сочетание помещает текущий процесс в фоновый режим и останавливает его выполнение. После этого вы можете получить доступ к оболочке.
  3. Убив процесс:

    После приостановки вы можете узнать идентификатор процесса (PID) с помощью команды:

    ps

    В выводе вы найдете список всех процессов, запущенных в текущем сеансе. Найдите PID вашего зависшего процесса.

    Затем выполните:

    kill thePID

    Если обычное завершение с помощью kill не сработало, можно использовать:

    kill -9 thePID

    Здесь -9 дает более сильный сигнал SIGKILL, который принудительно завершает процесс. Однако следует быть осторожным, так как это может привести к потере несохраненных данных.

Замечания по поводу команд:

  • Если вы всё еще не уверены, что происходит, и не можете определить, какую именно команду вы запустили, полезно знать, что многие программы имеют собственные подсистемы или интерфейсы командной строки. Например, в случае, если вы запустили текстовый редактор, такой как vim, вы можете находиться в режиме редактирования, и для выхода нужно выполнить определённые команды (например, :q или :wq для выхода с сохранением).

  • Если выбранный вами инструмент не выходит, подумайте о возможности использования системного монитора (например, htop или top), чтобы визуально идентифицировать и управлять процессами.

Заключение

Поиск способа выхода из зависшей программы или отмены неудачной команды может быть сложным, но в большинстве случаев он решается с помощью стандартных сочетаний клавиш и команд Bash. Следуйте представленным рекомендациям, и вы сможете эффективно управлять процессами в терминале.

Оцените материал
Добавить комментарий

Капча загружается...