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
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
Enterecho !$ Jar
Enter Up Enter ; og -
echo Foo
Skriv innecho $_ 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 tilM-.
. - @ 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.
echo
noe hvis du ' ikke er sikker på hva den ' gjør.echo $(rm -rf /)
--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.