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


27

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


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

@KeithThompson дякую за Ctrl + U, я цього не знав :-)
Патрік

Для запису Cu фактично не скасовує введену команду, вона переміщує її в буфер вставки (подібно до функцій "вирізання" деяких програм).
Кріс Даун

Відповіді:


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-#його: він помістить коментар і запустить команду (так, заносячи її у свою історію).
Зоравар

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.