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
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-15om 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 FooEnterecho !$ JarEnter Upp Enter ; och -
echo FooAngeecho $_ JarEnter 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 tillM-.. - @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.
echonågot om du ' inte vet vad det ' gör.echo $(rm -rf /)--no-preserve-rootalternativet 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.