Puncte:16

Cum execut din nou penultima comandă?

drapel cn

Folosesc Ubuntu 21.10. Dacă greșesc, pot rula din nou ultima comandă cu !!. Iată un exemplu:

actualizare $ apt
Citirea listelor de pachete... Gata
E: Nu s-a putut deschide fișierul de blocare /var/lib/apt/lists/lock - deschis (13: Permisiune refuzată)
E: Nu se poate bloca directorul /var/lib/apt/lists/
W: Problemă la deconectarea fișierului /var/cache/apt/pkgcache.bin - RemoveCaches (13: Permisiune refuzată)
W: Problemă la deconectarea fișierului /var/cache/apt/srcpkgcache.bin - RemoveCaches (13: Permisiune refuzată)
$ sudo !!
actualizare sudo apt
[sudo] parola pentru [me]:
...
Preluat 336 kB în 2 secunde (206 kB/s)
Citirea listelor de pachete... Gata
Construirea arborelui de dependență
Citirea informațiilor despre stare... Gata
98 de pachete pot fi actualizate. Rulați „apt list --upgradable” pentru a le vedea.

Este în regulă, dar în loc să rulez din nou comanda anterioară, cum o pot rula pe cea dinaintea ei? Ca aceasta:

$ echo salut
Bună
$ echo salut
Buna ziua
$!! <-- Încerc să fac ca asta să ruleze „echo hi”
Buna ziua

Practic, iată ce caut

$ echo salut
Bună
$ echo salut
Buna ziua
$ ??? <-- Ce pot pune aici pentru ca acesta să ruleze „echo hi”?
ecou salut!
buna!

Deci, având în vedere asta !! rulează ultima comandă, cum pot rula comanda înainte de cea anterioară? În exemplul meu, în loc să tastezi !!, ce pot să alerg să execut ecou salut?

raj avatar
drapel cn
raj
Comenzile rapide precum `!!` erau utile în vechiul `sh`, unde nu exista istoric de comenzi și editare. În `bash`, nu mai este nevoie să le folosiți, deoarece puteți merge liber la comenzile anterioare/următoare apăsând săgeata sus/jos.
bac0n avatar
drapel cn
`echo $(!-2)`, există și posibilitatea de a încorpora indicatorii de evenimente.
drapel cg
Dacă doriți să rulați comanda înainte de a o rula pe cea anterioară, vă sugerez să utilizați un add-on de mașină a timpului pentru bash. În timp ce, dacă doriți să rulați din nou comanda înainte de ultima, aceasta este o altă poveste.
drapel cg
Da... „reluați comanda înainte de ultima” sau „reluați comanda a N-a din istoric”
Itération 122442 avatar
drapel us
+1 pentru că m-ai învățat despre!! :)
drapel br
JoL
@raj În acord cu bac0n, le folosesc și pentru încorporare. Uneori rulez o comandă, apoi alta, apoi vreau să compar ieșirile și să fac ceva de genul `diff -u
Peter - Reinstate Monica avatar
drapel hn
https://man7.org/linux/man-pages/man3/readline.3.html, Ctrl-F „Comenzi pentru manipularea istoriei”
Puncte:41
drapel au

Puteți folosi Săgeata în sus și sageata in jos taste pentru a parcurge istoricul comenzilor. Deci, pentru a rula din nou ultima comandă, ați apăsa Săgeata în sus de două ori, atunci întoarcere.

Acest lucru are mai multe avantaje față de metode precum !-2. Cel mai important (după părerea mea), puteți vedea comanda și vă asigurați că este cea pe care intenționați să o executați din nou înainte de a apăsa Retur pentru a o executa. Chiar și în afară de greșelile simple ("hopa, cred că a fost a treia comandă pe care am vrut-o înapoi"), istoricul bash poate să nu conteze comenzile anterioare așa cum vă așteptați din cauza opțiunilor precum ignora spatiul, ignorate, si HISTCONTROL variabil.

De asemenea, rechemarea interactivă a comenzii vă permite să editați cu ușurință comanda înainte de a o rula din nou. Puteți face acest lucru și cu modificatorii de rechemare a istoricului, dar din nou, făcând-o interactiv, vă permite să vedeți editările înainte de a executa comanda rechemată/modificată.

În plus, dacă ești leneș ca mine, Săgeata în sus Săgeata în sus întoarcere este mai ușor de tastat decât (deplasare)exclamație minus 2 întoarcere

Quasímodo avatar
drapel jp
„Cel mai important (în opinia mea), puteți vedea comanda și vă asigurați că este cea pe care intenționați să o executați din nou înainte de a apăsa Retur pentru a o executa.” Dacă activați `histverify`, atunci orice comandă cu înlocuire a istoricului va trebui să fie confirmată înainte de a fi analizată de către shell. Cu toate acestea, sunt leneș ca tine, așa că aș prefera sugestia ta în acest caz particular.
Ruslan avatar
drapel bv
Dacă preferați să vă păstrați mâinile în jurul rândului de acasă, mai degrabă decât să vă plimbați pe tastatură, o combinație mai ușoară ar fi Ctrl-P (memorați ca „Previous”) în loc de Up Arrow și Ctrl-N (ca pentru „Next”) în loc de Săgeata în jos. Astfel, Ctrl-PP, Return.
Nate T avatar
drapel it
Cu un dezavantaj major fiind lipsa de scriptabilitate. Cel puțin în orice formă sensibilă.
Akbarkhon Variskhanov avatar
drapel mx
De asemenea, puteți apăsa M-^ (adică Alt+Shift+6 sau ESC Shift+6) pentru a iniția extinderea istoricului pe linia curentă.
Puncte:35
drapel hr

De la EXPANSARE A ISTORIEI sectiune de man bash:

!-n Consultați comanda curentă minus n

Deci, pentru a rula comanda înainte de ultima, puteți utiliza !-2

De fapt, !! este doar un sinonim al !-1

drapel tw
Vrei să spui că informaticienii încep să numere de la zero când merg înainte, dar de la -1 când merg înapoi? Unde au învățat acești tocilari să numere?
SusanW avatar
drapel in
@MikeMaxwell trebuie să fie doar o ciudatenie a istoriei :-D
OmarL avatar
drapel sy
@MikeMaxwell, în acest caz, 0 este ceea ce introduci în prezent; -1 este comanda anterioară, -2 este anterioară dar una. Are sens pentru mine :-)
HiddenWindshield avatar
drapel us
@OmarL Deci, dacă următoarea comandă pe care o voi tasta va fi `echo "Piața de valori va fi X"` în două ore, înseamnă asta că pot folosi `!1` pentru a vedea care este stocul? piața va fi în două ore de acum înainte?
OmarL avatar
drapel sy
@HiddenWindshield Este... creativ, dar fără zaruri: `-bash: !1: evenimentul nu a fost găsit`
Puncte:7
drapel tz

!-n executați comanda „-n” din istoricul dvs., dar nu v-aș recomanda-o, deoarece este „instantanee” și nu vă va da timp să verificați mai întâi dacă comanda „N-a” este cea potrivită pe care trebuie să o executați din nou. . ( @bac0n a remarcat frumos că puteți seta: shopt -s histverify pentru a-l comuta la „non instant”: vă va permite să verificați comanda !-n la care se extinde, înainte de a o executa cu <Enter>)

Cu toate acestea, dacă utilizați bash ca shell, prefer mult să vă recomand să utilizați funcția de căutare:

Ctrl și apoi tastați ceva, care este partea din comandă pe care o căutați. (ex: Ctrl + r + (tastați în terminal) ecou)

Va prezenta cea mai recentă apariție din potrivirea istorică ceva (adică, potrivirea termenului de căutare pe care l-ați introdus după Ctrl + r).

Ulterior Ctrl + r va privi mai departe în istoria ta. Sau adăugarea de litere va preciza căutarea.

Și odată ce găsiți o potrivire bună, apăsați introduce pentru a-l executa din nou (sau Ctrl + c pentru a ieși din căutare fără a executa comanda de potrivire afișată în prezent).

Sfat suplimentar: dacă, în loc de introduce , apăsați Ctrl + o , va executa comanda istorică selectată ȘI va prezenta următoarea, gata pentru a fi executată introduce (care îl execută doar pe acela și revine la promptul normal) sau Ctrl + o din nou (care îl execută și prezintă următoarea comandă din istoricul tău). Foarte util pentru a repeta o secvență de pași și pentru a oferi o afișare a acelor comenzi înainte de a le executa.

Și de fiecare dată când utilizați acele lucruri, aveți voie să modificați ceva pe linia afișată în prezent (folosind tasta săgeată stânga sau dreapta pentru a vă deplasa în ea), cum ar fi un parametru, un nume de server etc. și să executați acea linie modificată + treceți la următorul (dacă ați apăsat Ctrl + o).

bac0n avatar
drapel cn
Depinde de modul în care ați configurat opțiunea shell... puteți adăuga `shopt -s histverify` dacă nu doriți să rulați intrarea direct.
Nate T avatar
drapel it
De asemenea, ați putea adăuga că acesta este specific pentru bash. Cele mai multe shell-uri moderne au istoric de urmărire/reluare într-o formă sau alta, dar implementarea și sintaxa/comenzile rapide vor fi diferite de la un shell la altul.
drapel tz
mulțumesc @NateT și bac0n, 2 puncte bune pe care le-am omis în răspunsul meu. L-am editat în.
Ruslan avatar
drapel bv
Pentru a completa Ctrl-R pentru „căutare inversă”, există Ctrl-S pentru „căutare inversă” (utilă atunci când ați ratat intrarea corectă și trebuie să mergeți „înapoi”), deși există [o avertizare](https ://stackoverflow.com/q/791765/673852).
drapel tz
@Ruslan adaugă un lucru interesant, dar nu m-am obosit să îl adaug pe acesta, deoarece este folosit mai rar și uneori este legat de alte lucruri (ctrl-s [oprește terminalul să scoată caractere] ctrl-q [reia caracterul output], de exemplu, în mod implicit în o mulțime de shell-uri. A se vedea https://unix.stackexchange.com/a/72092/27616). Poate fi necesară o setare suplimentară (de readline? și stty) pentru a seta totul să funcționeze, iar exemplele pot fi găsite pe unix.se
Ruslan avatar
drapel bv
@OlivierDulac exact asta este avertismentul pe care îl adresează linkul meu :)
drapel tz
@Ruslan: hopa, nu l-am observat pe acela, scuze ^^
Puncte:4
drapel cn

Dacă fugi

istorie

veți obține o listă cu ultimele „n” comenzi introduse. Mărimea istoricului este implicită la 500 de comenzi. Deci, după cum a explicat Steeldriver, comanda dinaintea ultimei poate fi reluată cu

!-2

și da, al treilea cel din urmă va fi

!-3

și așa mai departe. Pentru mai multe detalii, folosiți

istoria omului

si cauta Desemnatori de evenimente.

kopaka avatar
drapel cn
O mică adăugare: puteți rula o comandă specifică din istoric folosind doar `!312` (pentru a rula comanda cu numărul de linie 312 afișat în rezultatul istoric). Sfat și mai util: dacă ați avut o greșeală de scriere în acea comandă, puteți rula `!312:p` care nu va executa comanda, dar o va pune totuși deasupra ca „ultima comandă folosită”. Acest lucru vă ajută să editați comenzi mai lungi fără copiere-lipire manuală din istoric, folosind pur și simplu săgeata în sus și editând comanda înainte de a o executa.
Latkar avatar
drapel cn
Grozav! Lista modificatorilor „istoriei” este plină de surprize. Mulțumiri!

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.