umieść polecenie historii w wierszu poleceń bez wykonywania go

57

Używam! N gdzie (n) to numer wiersza do wykonania wiersza w pliku historii, który chcę wykonać w wierszu polecenia, który znajduję poprzez historię | mniej.

Ale jest zdarzenie historii wiersza poleceń, które chcę ręcznie zmodyfikować. Jak mogę wstawić do wiersza poleceń zawartość zdarzeń historii bez jej wykonania, aby móc zmodyfikować, a następnie nacisnąć klawisz Return?

Najlepsza,

Vass
źródło

Odpowiedzi:

71

Aby zażądać wydrukowania polecenia zamiast wykonania po podstawieniu historii, dodaj :p modyfikator , np !42:p. Wynikowe polecenie zostanie również wprowadzone do historii, więc można je nacisnąć, Upaby je edytować.

Jeśli masz histverify opcję set ( shopt -s histverify), zawsze będziesz mieć możliwość edycji wyniku podstawienia historii.

fcWbudowane daje ograniczony dostęp do ekspansji historii (bez oznaczników słowo) i pozwala edytować poprzednie polecenie w zewnętrznym edytorze.

Możesz użyć, !prefixaby odwołać się do ostatniego polecenia zaczynającego się na prefix, oraz !?substringdo odwołania się do ostatniego polecenia zaczynającego się od substring. Gdy wiesz, czego szukasz, może to zaoszczędzić dużo czasu history | less.

Innym sposobem wyszukiwania w poprzedniej historii jest wyszukiwanie przyrostowe: naciśnij Ctrl+ Ri zacznij wpisywać podciąg tego, czego szukasz. Naciśnij Ctrl+, Raby przejść do poprzedniego wystąpienia szukanego ciągu i Ctrl+, Sjeśli zaszedłeś za daleko. Większość przycisków innych niż Ctrl+ R, Ctrl+ S, Backspacei zwykłych znaków zakończyć wyszukiwanie przyrostowe i mają zwykle efekt (np klawiszy strzałek, aby przesunąć kursor w linii Dodzwoniłeś, Enteraby uruchomić polecenie).

Gilles „SO- przestań być zły”
źródło
W twoim pierwszym przykładzie jest literówka ...
pbm
9
Musisz zrobić, stty -ixonzanim Ctrl-s zadziała.
Dennis Williamson
@Dennis: Wow, nowoczesne emulatory terminali nie robią tego domyślnie? <test> Masz rację, nawet terminal gnome w Ubuntu ma kontrolę przepływu!
Gilles „SO- przestań być zły”
Nie wiem, dlaczego nadal tak robią. Nie można złapać czegoś podczas przewijania. Zanim naciśniesz Ctrl-s, ponownie pojawi się monit. Powolne połączenia szeregowe należą już do przeszłości.
Dennis Williamson
@ Punkt Dennisa Ctrl-sjest ważny, w przeciwnym razie utkniemy tak jak ja .
imz - Ivan Zakharyaschev
15

Kolejny mały: Alt+#

komentuje bieżący wiersz i przenosi go do bufora historii.

Więc kiedy tworzysz wiersz poleceń i musisz wydać polecenie tymczasowe, aby np. Znaleźć plik, po prostu naciśnij Alt+ #, wydaj drugie polecenie, przejdź do historii, odkomentuj i kontynuuj.

Rahul Patil
źródło
2
Również Esc, #działa
Steven Penny
i możesz wpisać to na Macu (przytrzymaj Shift, naciśnij ESC i # razem), w przeciwieństwie do innych kombinacji ket (fn + alt + shift + #) ;-)
0xF2
7

Możesz użyć magicznej przestrzeni, aby rozwinąć historię przed wejściem do Enter. W twoim .inputrc zamapuj przestrzeń na magiczną przestrzeń:

$if Bash
     Space: magic-space
$endif

Teraz, za każdym razem, gdy wpiszesz spację po specyfikacji historii, zostanie ona natychmiast rozszerzona - przydatne, jeśli chcesz ją edytować!

Cascabel
źródło
7

Spójrz na history-expand-linepolecenie Alt+^domyślnie powiązane . Rozwinie linię w miejscu, którą możesz następnie edytować.

Alex Barrett
źródło
4

Za pomocą Ctrl+rmożesz przeszukiwać historię:

pbm@tauri ~ $ 
(reverse-i-search)`xran': xrandr -o normal

Każde znalezione polecenie można edytować ...


Myślę, że znalazłem dokładnie to, czego potrzebujesz: uruchom shopt -s histverifyi następnym razem, gdy będziesz chciał użyć !npolecenia, nie zostanie wykonane, a tylko wprowadzone do wiersza poleceń ...

pbm
źródło
Musisz wykonać polecenie, zanim będzie można je przeszukać za pomocą Ctrl + r, a nie tego, o co prosi Vass.
phunehehe
1
Nie rozumiem, jak to nie robi tego, o co prosi. Dodałbym, że jeśli chcesz najpierw edytować polecenie przed jego uruchomieniem, możesz po prostu nacisnąć TAB, gdy znajdziesz właściwe polecenie.
Steven D,
2
Tak więc procedura byłaby taka: (1) Ctrl + r, (2) wpisz, dopóki nie znajdziesz polecenia, (3) TAB, (4) polecenie edycji, (5) ENTER.
Steven D,
1
@phuenhehe: „Ale jest zdarzenie historii wiersza poleceń, które chcę ręcznie zmodyfikować”
PBM
1
Nie !n:pzadziała?
alex
1

Często tego chciałem. Kiedy użyłem csh (i tcsh), miałem idiom:
!:88*:p

Ten idiom wstawia „słowo 88 do ostatniego słowa” poprzedniego polecenia w punkcie, w którym piszesz w bieżącym wierszu polecenia, który zazwyczaj jest końcem. W csh takie wyrażenie nie generuje żadnych słów. Oznacza to, że nie musi istnieć słowo 88 ani żadne następne. Jeśli nie ma słowa 88, nie dodaje on żadnych słów na końcu wpisywanego polecenia, a następnie wypycha wynikowy wiersz polecenia do historii bez wykonania.

Jak zapewne wiesz
*! (jak !! i! -1) to poprzednie polecenie;
*: 88 to słowo 88 (pierwsze słowo - zazwyczaj polecenie - ma wartość zero) i csh wymagałoby takiego słowa, ale ...
*: 88 * to wszystkie słowa zaczynające się od słowa 88, a następnie csh robi nie wymagają tego słowa;
*: p oznacza print, ale nie uruchamiaj wiersza poleceń.
Z: p lub bez: wiersz poleceń jest dodawany do historii poleceń.

„Dlaczego 88?” zastanawiasz się? Ponieważ jest to ten sam klucz, co * potrzebuję. Jeśli masz tak długie polecenia, być może!: 888 *: p jest tym, czego potrzebujesz. Przepraszamy, to nie działa z Bash AFAIK. Bash powie tylko bash: :88*: bad word specifier

Ciekawostka: Twoje polecenie zwykle nie musi być pierwsze.
> /tmp/foo echo My command is word 3
jest poprawny w bash i csh.

W Dean Stanton
źródło
Ponieważ pytanie jest oznaczone jako bash, warto zacząć od stwierdzenia, że ​​twoje rozwiązanie działa tylko w (t) csh.
zagrimsan
0

Zwykle używam Ctrl+ rdo wyszukiwania, a następnie Ctrl+ edo przejścia do końca linii bez wykonywania.

nikc
źródło
już wspomniany
Jeff Schaller
@JeffSchaller Nie widzę tego. Widzę odniesienie CTRL + R. Nie, gdzie widzę CTRL + E, który jest brakującym elementem układanki w powyższych postach.
nikc