Hva betyr! $?

Jeg følger en opplæring og det nevnes å kjøre denne kommandoen:

sudo chmod 700 !$ 

Jeg er ikke kjent med !$. Hva betyr det?

Kommentarer

  • Det ' er generelt trygt å prøve å echo noe hvis du ' ikke er sikker på hva den ' gjør.
  • @Shadur, ikke alltid. echo $(rm -rf /)
  • @cjm Med mindre du ' er på et virkelig gammelt system, er du ' trenger --no-preserve-root -alternativet der inne, og hvis du ser ordene " beholder du ikke " i et program bør du tenke nøye nøye over hva det gjør.
  • @WChargin Vær veldig forsiktig med å anta at " virkelig gammel " og " ikke Linux / ikke bruker GNU-kjernefiler " er det samme; de er ' t.

Svar

I utgangspunktet er det «er det siste argumentet til forrige kommando.

!$ er» slutten «på forrige kommando Tenk på følgende eksempel: Vi begynner med å lete etter et ord i en fil:

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

hvis joe er i brukerlisten, vil vi fjerne ham fra den. Vi kan enten fyre opp vi med det lange katalogtreet som argument, eller så enkelt som vi !$ Hvilken bash utvides til:

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

( kilde ; praktisk guide, forresten)


Det er ingenting verdt å skille mellom dette !$ token og den spesielle skallvariabelen $_ . Faktisk utvides begge til det siste argumentet i forrige kommando. !$ utvides imidlertid under historikkutvidelse , mens $_ utvides under parameterutvidelse . En viktig konsekvens av dette er at når du bruker !$, blir kommandoen utvidet lagret i historikken din.

For eksempel, vurdere tastetrykkene

  • echo Foo Enter echo !$ Jar Enter Up Enter ; og

  • echo Foo Skriv inn echo $_ Jar Skriv inn Opp Enter .

(De eneste tegnene som er endret er $! og $_ i midten.)

I det første, når du trykker Opp , kommer kommandolinjen leser echo Foo Jar, så den siste linjen skrevet til stdout er Foo Jar.

I sistnevnte, når du trykker Opp , kommandolinjen leser echo $_ bar, men nå har $_ en annen verdi enn den gjorde tidligere – faktisk $_ er nå Jar, så den siste linjen skrevet til stdout er Jar Jar.

En annen konsekvens er at _ kan brukes i andre parameterutvidelser, for eksempel kommandosekvensen

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

skriver ut isomorphism isosceles. Men det er ingen analog ${!$%morphism} «utvidelse.

For mer informasjon om utvidelsesfasene i Bash, se EXPANSION delen av man 1 bash (dette kalles Shell-utvidelser i den elektroniske utgaven). HISTORY EXPANSION seksjonen er atskilt.

Kommentarer

  • Hyggelig. Godt å vite. Også bra der ' s Stack Exchange. Det ' er vanskelig å søke på Google etter noe som !$
  • BTW, på kommandolinjen kan du sette inn det siste argumentet i forrige kommando med insert-last-argument, vanligvis bundet til M-..
  • @ Andrew husk å godta dette hvis det svarer på spørsmålet ditt. Å akseptere og oppstemme i stedet for å legge inn kommentarer er hvordan takk uttrykkes i SE-nettverket, se her for " offisiell " holdning.
  • @Andrew FYI, jeg søkte på Google etter " bash bang dollar " og fikk anstendige resultater, inkludert denne lenken som tredje oppføring.
  • @terdon Jeg prøvde å godta svaret i går kveld, men det var så raskt at jeg var tvunget til å vente med å godta det.

Svar

Strengt tatt !$ er det siste ordet i den siste kommandoen fra historielisten.

ord – En sekvens av tegn som behandles som en enhet av skallet. Ord inkluderer kanskje ikke unoterte metategn.

metategn – Et tegn som, når det ikke siteres, skiller ord. En metategn er et tomt eller ett av følgende tegn: |, &, ;, (, ), < , eller >

blank – Et mellomrom eller fanetegn.

Eksempler:

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 

Kommentarer

Svar

!$ gir deg den siste kommandoen som ble brukt for den aktuelle brukeren ….

kan du også finne historikken til kommandoer som ble brukt tidligere ved å bruke history -kommandoen … prøv den ….

MERK: For en bestemt bruker lagres alle kommandoene som ble brukt tidligere under bash-historikkfilen.

Kommentarer

  • De andre svarene stemmer. Denne er feil.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *