Ce înseamnă! $?

Urmez un tutorial și menționează executarea acestei comenzi:

sudo chmod 700 !$ 

Nu sunt familiarizat cu !$. Ce înseamnă?

Comentarii

  • ' În general, este sigur să încercați să echo ceva dacă ' nu sunteți sigur ce va face '.
  • @Shadur, nu întotdeauna. echo $(rm -rf /)
  • @cjm Cu excepția cazului în care ' sunteți pe un sistem cu adevărat vechi, ' voi avea nevoie de opțiunea --no-preserve-root acolo și, dacă vedeți cuvintele ", nu conservați " într-un program ar fi bine să vă gândiți cu atenție la ceea ce face.
  • @WChargin Fiți foarte atenți presupunând că " foarte vechi " și " nu Linux / nu folosesc coreutils GNU " sunt același lucru; acestea nu sunt ' t.

Răspuns

Practic, „este ultimul argument la comanda anterioară.

!$ este„ sfârșitul ”comenzii anterioare . Luați în considerare următorul exemplu: Începem prin a căuta un cuvânt într-un fișier:

grep -i joe /some/long/directory/structure/user-lists/list-15 

dacă joe se află în acea listă de utilizatori, vrem să îl eliminăm din ea . Putem declanșa vi cu acel arbore de directoare lung ca argument, sau la fel de simplu ca vi !$ Care bash se extinde la:

vi /some/long/directory/structure/user-lists/list-15 

( sursă ; ghid util, apropo)


Nu merită nimic distincția dintre acest simbol !$ și variabila specială shell $_ . Într-adevăr, ambele se extind la ultimul argument al comenzii anterioare. Cu toate acestea, !$ este extins în timpul extinderii istoricului , în timp ce $_ este extins în timpul extinderii parametrilor . O consecință importantă a acestui fapt este că, atunci când utilizați !$, comanda extinsă este salvată în istoricul dvs.

De exemplu, ia în considerare apăsările de taste

  • echo Foo Enter echo !$ Jar Enter Sus Enter ; și

  • echo Foo Enter echo $_ Jar Introduceți Sus Enter .

(Singurele caractere modificate sunt $! și $_ la mijloc.)

În prima, când apăsați Sus , linia de comandă citește echo Foo Jar, astfel încât ultima linie scrisă în stdout este Foo Jar.

În acesta din urmă, când apăsați Sus , linia de comandă citește echo $_ bar, dar acum $_ are o valoare diferită decât o făcuse anterior – într-adevăr, $_ este acum Jar, deci ultima linie scrisă în stdout este Jar Jar.

O altă consecință este că _ poate fi utilizat în alte extensii de parametri, de exemplu, secvența de comenzi

printf "%s " isomorphism printf "%s\n" ${_%morphism}sceles 

tipărește isomorphism isosceles. Dar nu există o expansiune analogică ${!$%morphism} „.

Pentru mai multe informații despre fazele de expansiune din Bash, consultați EXPANSION secțiunea din man 1 bash (aceasta se numește Shell Expansions în ediția online). HISTORY EXPANSION secțiunea este separată.

Comentarii

  • Frumos. Bine de știut. De asemenea, un lucru bun acolo ' s Stack Exchange. Este ' greu de căutat pe Google ceva de genul !$
  • BTW, pe linia de comandă, puteți insera ultimul argument al comenzii anterioare prin insert-last-argument, de obicei legat de M-..
  • @Andrew, vă rugăm să nu uitați să acceptați acest lucru dacă vă răspunde la întrebarea dvs. Acceptarea și votarea în sus, mai degrabă decât postarea de comentarii sunt modul în care mulțumirile sunt exprimate în rețeaua SE, consultați aici pentru " poziția oficială ".
  • @Andrew FYI, am căutat pe Google " bash bang dollar " și am obținut rezultate decente, inclusiv acest link ca a treia listare.
  • @terdon Am încercat să accept răspunsul aseară, dar a fost atât de rapid încât am fost forțat să aștepte să-l accepte.

Răspuns

Vorbind strict !$ este ultimul cuvânt din ultima comandă din lista istoric.

cuvânt – O secvență de caractere tratate ca o unitate de către shell. Cuvintele nu pot include metacaractere necotate.

metacaracter – Un caracter care, atunci când este necotat, separă cuvintele. O metacaracter este un gol sau unul dintre următoarele caractere: |, &, ;, (, ), < , sau >

gol – Un spațiu sau un caracter tab.

Exemple:

set -o history # enable command history set -o histexpand # enable ! style history substitution HISTSIZE=10 # save all lines on the history list HISTCONTROL= HISTIGNORE= date echo !$ # prints date date>/dev/null echo !$ # prints /dev/null echo a b c>/dev/null echo !$ # prints /dev/null HISTCONTROL=ignorespace # lines which begin with a space character are not saved in the history list echo a b c echo d e f # space at the beginning echo !$ # prints c 

Comentarii

Răspuns

!$ vă va da ultima comandă utilizată pentru acel anumit utilizator ….

puteți găsi, de asemenea, istoricul comenzilor utilizate anterior folosind comanda history … încercați ….

NOTĂ: Pentru un anumit utilizator, toate comenzile utilizate anterior vor fi stocate în fișierul istoric bash.

Comentarii

  • Celelalte răspunsuri sunt corecte. Acesta este greșit.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *