Vad betyder! $?

Jag följer en tutorial och det nämns att köra det här kommandot:

sudo chmod 700 !$ 

Jag är inte bekant med !$. Vad betyder det?

Kommentarer

  • Det ' är i allmänhet säkert att försöka echo något om du ' inte vet vad det ' gör.
  • @Shadur, inte alltid. echo $(rm -rf /)
  • @cjm Om du inte ' är på ett riktigt gammalt system, så ' kommer att behöva --no-preserve-root alternativet där inne, och om du ser orden " inget bevara " i ett program bör du tänka riktigt noga över vad det gör.
  • @WChargin Var mycket försiktig om du antar att " riktigt gammal " och " inte Linux / inte använder GNU-kärnverktyg " är samma sak; de är ' t.

Svar

I grund och botten är det ”är det sista argumentet till föregående kommando.

!$ är” slutet ”på föregående kommando Tänk på följande exempel: Vi börjar med att leta efter ett ord i en fil:

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

om joe finns i användarlistan, vill vi ta bort honom från den Vi kan antingen avfyra vi med det långa katalogträdet som argument, eller så enkelt som vi !$ Vilken bash expanderar till:

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

( källa ; praktisk guide förresten)


Det är ingenting värt att skilja mellan denna !$ -token och den speciella skalvariabeln $_ . Faktum är att båda expanderar till det sista argumentet i föregående kommando. !$ utökas dock under historiaxpansion medan $_ expanderas under parameterutvidgning . En viktig konsekvens av detta är att när du använder !$, sparas kommandot utökat i din historik.

Till exempel, överväga tangenttryckningarna

  • echo Foo Enter echo !$ Jar Enter Upp Enter ; och

  • echo Foo Ange echo $_ Jar Enter Upp Enter .

(De enda tecken som ändrats är $! och $_ i mitten.)

I det första, när du trycker på Upp , kommer kommandoraden läser echo Foo Jar, så den sista raden skriven till stdout är Foo Jar.

I den senare, när du trycker på Upp läser kommandoraden echo $_ bar, men nu har $_ ett annat värde än tidigare – faktiskt $_ är nu Jar, så den sista raden som skrivs till stdout är Jar Jar.

En annan konsekvens är att _ kan användas i andra parameterutvidgningar, till exempel kommandosekvensen

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

skriver ut isomorphism isosceles. Men det finns ingen analog ”${!$%morphism}” expansion.

För mer information om faserna av expansion i Bash, se EXPANSION avsnitt i man 1 bash (detta kallas Shell Expansions i onlineutgåvan). HISTORY EXPANSION avsnittet är separat.

Kommentarer

  • Trevligt. Bra att veta. Dessutom bra där ' s Stack Exchange. Det ' är svårt att söka på Google efter något som !$
  • BTW, på kommandoraden kan du infoga det sista argumentet i föregående kommando med insert-last-argument, vanligtvis bunden till M-..
  • @Andrew kom ihåg att acceptera detta om det svarar på din fråga. Att acceptera och rösta snarare än att lägga upp kommentarer är hur tack uttrycks i SE-nätverket, se här för " officiell " hållning.
  • @Andrew FYI, jag sökte på Google efter " bash bang dollar " och fick anständiga resultat, inklusive den här länken som den tredje listan.
  • @terdon Jag försökte acceptera svaret igår kväll, men det var så snabbt att jag var tvingades vänta med att acceptera det.

Svar

Strikt taget !$ är det sista ordet i det sista kommandot från historiklistan.

ord – En sekvens av tecken som behandlas som en enhet av skalet. Ord får inte innehålla ociterade metatecken.

metatecken – Ett tecken som, när det inte citeras, separerar ord. En metatecken är ett tomt eller ett av följande tecken: |, &, ;, (, ), < , eller >

tomt – Ett mellanslag eller tabbtecken.

Exempel:

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

!$ ger dig det senaste kommandot som användes för just den användaren ….

kan du också hitta historiken för kommandon som använts tidigare genom att använda history kommandot … prova det ….

OBS: För en viss användare lagras alla kommandon som använts tidigare under bash-historikfil.

Kommentarer

  • De andra svaren är rätt. Den här är fel.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *