Неправильно ли использовать CTRL + C для возврата в командную строку?


27

Когда я использую tail -fи хочу вернуться в оболочку, я всегда использую CTRL+C. Или когда я набираю команду и испытываю желание прервать ее и начать заново, я просто CTRL+Cвозвращаюсь к пустой командной строке. Это считается плохой практикой? Я иногда чувствую, что может быть лучший способ оторваться от чего-то, но на самом деле понятия не имею.


6
Чтобы отменить частично введенную команду оболочки, вы можете использовать Control-U или Delete (в зависимости от ваших настроек tty и привязок клавиш), но с использованием Control-C все в порядке.
Кит Томпсон

@KeithThompson спасибо за Ctrl + U, я не знал об этом :-)
Патрик

Для записи, Cu фактически не отменяет введенную команду, она перемещает ее в буфер вставки (аналогично функциональности «cut» некоторых программ).
Крис Даун

Ответы:


36

Ctrl+ Cотправляет SIGINT в программу. Это говорит программе, что вы хотите прервать (и завершить) процесс. Большинство программ правильно ловят это и чисто выходят. Так что, да, это «правильный» способ завершить большинство программ.

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


9
Также есть Ctrl + D для программ, которые читают ввод от пользователя. Ctrl + D закрывает STDIN для программы. Для изящного выхода из оболочки это также доступно (точно так же, как и при вводе).
Патрик

2
@Patrick Ctrl + D фактически отправляет индикатор конца файла в поток. Программа должна отвечать соответствующим образом (обычно закрывая поток файлов).
Крис С

это то, что делает закрытие STDIN. Вы не можете получить EOF без закрытия канала / потока.
Патрик

9
Неправильно по трем причинам, Патрик. Первое: Control + D не имеет этого значения для каналов. Второе: специальный символ EOF ничего не закрывает. Это вызывает однократный возврат нулевых байтов (при условии, что буфер строки пуст) из текущего read()системного вызова. Следующие read()s не затронуты. Третье. Ничто из этого не относится к программам, переводящим дисциплину строк в неканонический режим, таким как большинство программ-оболочек за последние пару десятилетий и даже к любой другой программе, использующей такие библиотеки, как GNU readline.
JdeBP


11

Чтобы прервать длинную команду при наборе текста, я иногда прыгаю в начало строки и вставляю знак комментария, прежде чем нажать enter:

Home#Enter

Pos1#Return

Это полезно, если, например, я набрал команду копирования с длинным путем и заметил, что сначала мне нужно создать каталог, но потом я хотел бы повторить команду. Тогда мне просто нужно взять его из истории, удалить хэш и ввести его.

В Bash вы можете использовать ярлык

Alt+#

чтобы отметить вашу команду, как указано в комментариях (Спасибо, @Zorawar).


6
Вы также можете использовать, Ctrl-Aне отрывая пальцев от домашнего ряда.
Дитрих Эпп

1
И Ctrl-Eидет до конца, кстати.
Дэйв

@Dave: Это верно, но вам не нужно переходить к концу, чтобы нажать Enter, чтобы подтвердить свою команду. Командная строка не является редактором, где это может вставить новую строку.
пользователь неизвестен

2
В bash вы можете добиться того же самого, просто нажав Alt-#: он вставит комментарий и запустит команду (так что внесите ее в историю).
Zorawar

8

Вообще говоря, использование Ctrl+ Cхорошо, когда программа не предлагает вам интерактивного способа завершить работу (либо по замыслу, либо, чаще, потому что она зависла или стала непригодной для использования). Просто имейте в виду, что в интерактивном режиме комбинация клавиш, которую вы действительно хотите, может быть Ctrl+ D, что отправляет EOFсигнал о конце ввода.


1

Если вы используете Bash, вы можете также использовать Ctrl- Zи набрать bg«поместить текущее задание в фоновый режим».


0

Как сказал @Patrick в комментарии к принятому ответу,

Там также Ctrl+Dдля программ, которые читают ввод от пользователя. Ctrl+Dзакрывает STDIN для программы.

Это помогло мне, когда Ctrl+Cне получилось вернуть командную строку после использования>>

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.