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-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
Enterecho !$ Jar
Enter Upp Enter ; och -
echo Foo
Angeecho $_ 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 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.
echo
något om du ' inte vet vad det ' gör.echo $(rm -rf /)
--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.