W bash, jak wyczyścić bieżące wejście?

172

Załóżmy, że w bashu zaczynasz pisać polecenie takie jak:

$ rm -rf /foo/bar/really/long/path/here

a potem zdaj sobie sprawę, że mimo wszystko nie chcesz tego wykonywać. Czy istnieje sposób na wyczyszczenie danych wejściowych za pomocą jednego lub dwóch naciśnięć klawiszy?

To, co ostatnio robiłem, to poprzedzanie echa i umieszczanie danych wejściowych w cudzysłowach (Ctrl + A echo ", Ctrl + E "), a następnie wciskanie enter. Czy jest szybszy sposób?

user85509
źródło
Lub załóżmy, że wklejasz polecenie i zdajesz sobie sprawę, że to niewłaściwa jedna linijka. Backspace naprawdę się starzeje po około 20 znakach!
bgStack15
<kbd> Ctrl </kbd> - <kbd> C </kbd>, jeśli chcesz zachować historię,
wejdź

Odpowiedzi:

286
  1. Naciśnij Ctrl-, Uaby usunąć wszystko przed kursorem. Usunięte polecenie zostanie zapisane w buforze. Naciśnij Ctrl-, Yaby wkleić usunięte polecenie.

    (Opcjonalnie: naciśnij Endlub Ctrl-, Eaby najpierw przeskoczyć na koniec wpisu).

  2. Możesz też nacisnąć Ctrl-, Caby przerwać wpisywanie.

John Kugelman
źródło
28
Jest pewne zastrzeżenie: Ctrl-C zabije bieżący znak zachęty, uruchomi nowy monit i ustawi kod powrotu na 1.
user716468
14
Nie przyzwyczajaj się do tego, użyj Ctrl-U. Ctrl-C nie jest taki zły w bashu, ale jeśli masz np. Monit klienta mysql, Ctrl-C rozłączy się z serwerem, co jest naprawdę denerwujące.
Christian,
1
Zauważ, że w wielu systemach istnieje również znak „zabicia” terminala, który do tej pory zabija dane wejściowe. Często jest to Ctrl-X. Możesz to sprawdzić stty -a. I to zadziała z każdym programem, który nie modyfikuje aktywnie elementów sterujących terminala.
Jonathan Leffler
Ctrl-A, po którym następuje Ctrl-K, również działa. „Zabity” tekst jest przechowywany i można go wkleić za pomocą Ctrl-Y. W rzeczywistości te naciśnięcia klawiszy pochodzą z biblioteki linii odczytu: cnswww.cns.cwru.edu/php/chet/readline/rluserman.html .. więc można je znaleźć w dowolnym narzędziu, które interfejs użytkownika korzysta z biblioteki (właściwie Emacs, bash, itp..). Możesz dostosować jego zachowanie, edytując plik .inputrc (więcej informacji znajdziesz w powyższym linku).
rkachach
93

Wypróbuj Ctrl+ U. To czyści linię wejściową.

gbarry
źródło
7
Dzięki, prawie zaakceptowałem to jako odpowiedź. Ale odkryłem, że czyści tylko dane wejściowe przed kursorem. W niektórych przypadkach jestem w trakcie edycji polecenia, więc wolałbym raczej pamiętać Ctrl + C zamiast Ctrl + U jako po prostu „odrzucić bieżące wejście”.
user85509
21

Ctrl- U, Ctrl- Kteż załatwia sprawę.

Ctrl- Uusuwa wszystko od początku wiersza do kursora, Ctrl- Kusuwa wszystko od kursora do końca wiersza. (Czasami warto użyć tylko jednego z nich).

rur
źródło
13

Istnieją dwie możliwości, aby to zrobić

ctrl+ c- czyści całą linię, bez względu na to, gdzie znajduje się kursor.

ctrl+ u- czyści linię od pozycji kursora do początku.

vks
źródło
2
„Weź pod uwagę, że użycie Cu (lub Ce, a następnie Cu) zapisze to, co wyczyścisz w buforze, aby można było wkleić to później za pomocą Cy”. Markisisme prostszym pojedynczym poleceniem jest ctrl + _. stackoverflow.com/questions/1056440/ ... odpowiedział john kug - właśnie uruchomiłem stackoverflow Nie masz wystarczającej liczby punktów, aby dodać komentarz do Twojej odpowiedzi.
vks
9

Naciśnięcie fajnego skrótu Esc#. Doda #znak na początku (w ten sposób czyni wiersz komentarzem), a następnie naciśnie klawisz Enter. Jeśli wtedy zdecydujesz, że nadal potrzebujesz polecenia, nadal masz je w swojej historii :)

knittl
źródło
3
W większości terminali jest to to samo, co Alt + #, co powoduje, że jest to jedno (akordowe) naciśnięcie klawisza.
Dolda2000,
Proste, ale sprytne rozwiązanie i myślę, że jest to bardziej przyjazny dla użytkownika sposób anulowania polecenia. Dokładnie to, czego szukałem :)
Cas
9

Naciśnięcie Escplusa Backspacew bash wyczyści wszystko aż do pozycji kursora.

(W Cygwin wyczyści to dane wejściowe aż do następnego słowa. Słowa są oddzielone spacjami, podkreśleniami, ...)

Nippey
źródło
3

Weź pod uwagę, że użycie Ctrl- U(lub Ctrl- Ea potem Ctrl- U) zapisze to, co wyczyścisz w buforze, abyś mógł później wkleić to za pomocą Ctrl- Y.

goncalotoma
źródło
3

Jeśli używasz Bash w trybie vi (ustaw go za pomocą set -o vi), naciśnij, Escaby przejść do normalnego trybu vi, i wpisz, ddaby usunąć bieżącą linię!

Helmyano
źródło
3

Jest to rozwinięcie odpowiedzi knittla, która przechowuje wiersz w historii konsoli, poprzedzając go hashem. Pokonanie wad schowka, takich jak przypadkowe nadpisanie lub brak możliwości przeglądania linii cięcia w celach informacyjnych.

Linia komentarza i nowy monit

Użyj dowolnego skrótu klawiszowego:

  • Esc,#
  • Alt+#

Znak krzyżyka #zostanie dodany do wiersza, zmieniając w ten sposób cały wiersz w komentarz. Zwróci również nowy monit, tak jakby użytkownik nacisnął klawisz enter. na przykład

$ #rm -rf /foo/bar/really/long/path/here
$

Pobierz skomentowaną linię

Aby odzyskać stary wiersz z historii konsoli, użyj jednego z następujących skrótów:

  • Up
  • Ctrl+p

Powtarzaj klawisz skrótu, aż pojawi się żądana linia.


Szybkie usuwanie prefiksu skrótu

Aby usunąć #przedrostek z linią, dostępnych jest kilka różnych opcji:

Usuń pierwszy znak i natychmiast wykonaj polecenie:

  • Esc, 1, Esc,#
  • Alt+ -, Alt+#

Przesuń kursor, aby rozpocząć i usunąć pierwszy znak, bez wykonywania polecenia:

  • Home, Delete
  • Ctrl+ a, Ctrl+d
Cas
źródło
2

Aby usunąć bieżącą linię, spróbuj:

Ctrl- X, Ctrl-U

Alternatywnie możesz użyć:

Esc-D

który wymaga w ~ / .inputrc:

"\ed": kill-whole-line 

zobacz: http://codesnippets.joyent.com/posts/show/1690

goncalotoma
źródło
Jeśli chcesz, aby tylko klawisz Escape wyczyścił całą linię, dodaj "\e\e": kill-whole-line(chociaż należy dwukrotnie nacisnąć klawisz esc)
binaryfunt