Ik volg een tutorial en het vermeldt om deze opdracht uit te voeren:
sudo chmod 700 !$
Ik “ben niet bekend met !$
. Wat betekent het?
Reacties
Antwoord
Kortom, het “is het laatste argument voor het vorige commando.
!$
is het” einde “van het vorige commando Beschouw het volgende voorbeeld: we beginnen met het zoeken naar een woord in een bestand:grep -i joe /some/long/directory/structure/user-lists/list-15
als joe in die gebruikerslijst staat, willen we hem eruit verwijderen . We kunnen vi opstarten met die lange directorystructuur als argument, of zo simpel als
vi !$
Welke bash wordt uitgebreid naar:vi /some/long/directory/structure/user-lists/list-15
( source ; handige gids trouwens)
Het is niets waard het onderscheid tussen dit !$
token en de speciale shell-variabele $_
. Inderdaad, beide breiden uit naar het laatste argument van het vorige commando. !$
wordt echter uitgevouwen tijdens geschiedenisuitbreiding , terwijl $_
wordt uitgevouwen tijdens parameteruitbreiding . Een belangrijk gevolg hiervan is dat, wanneer u !$
gebruikt, de opdracht geëxpandeerd wordt opgeslagen in uw geschiedenis.
Bijvoorbeeld: overweeg de toetsaanslagen
-
echo Foo
Voerecho !$ Jar
Voer Omhoog Voer in; en -
echo Foo
Voerecho $_ Jar
Typ Omhoog Enter.
(De enige gewijzigde tekens zijn de $!
en $_
in het midden.)
In de eerste, wanneer u op Omhoog drukt, geeft de opdrachtregel leest echo Foo Jar
, dus de laatste regel die naar stdout wordt geschreven is Foo Jar
.
In de laatste, wanneer u op Omhoog , de opdrachtregel leest echo $_ bar
, maar nu heeft $_
een andere waarde dan voorheen – inderdaad, $_
is nu Jar
, dus de laatste regel die naar stdout wordt geschreven is Jar Jar
.
Een ander gevolg is dat _
kan worden gebruikt in andere parameteruitbreidingen, bijvoorbeeld de reeks opdrachten
printf "%s " isomorphism printf "%s\n" ${_%morphism}sceles
drukt isomorphism isosceles
af. Maar er is geen analoge ${!$%morphism}
“uitbreiding.
Voor meer informatie over de uitbreidingsfasen in Bash, zie de EXPANSION
sectie van man 1 bash
(dit wordt Shell-uitbreidingen genoemd in de online editie). De HISTORY EXPANSION
sectie is gescheiden.
Reacties
- Leuk. Goed om te weten. Ook goed daar ' s Stack Exchange. Het ' is moeilijk om op Google te zoeken naar iets als
!$
- Trouwens, op de opdrachtregel kun je het laatste argument van het vorige commando invoegen met
insert-last-argument
, meestal gebonden aanM-.
. - @Andrew vergeet niet om dit te accepteren als het uw vraag beantwoordt. Accepteren en upvoten in plaats van opmerkingen plaatsen is de manier waarop dank wordt uitgedrukt op het SE-netwerk, zie hier voor de " officiële " standpunt.
- @Andrew Ter info, ik zocht op Google naar " bash bang dollar " en kreeg behoorlijke resultaten, inclusief deze link als derde vermelding.
- @terdon Ik heb gisteravond geprobeerd het antwoord te accepteren, maar het ging zo snel dat ik gedwongen te wachten om het te accepteren.
Antwoord
Strikt genomen !$
is het laatste woord van het laatste commando uit de geschiedenislijst.
woord – Een reeks tekens die door de shell als een eenheid worden behandeld. Woorden mogen geen metatekens zonder aanhalingstekens bevatten.
metateken – Een teken dat, wanneer het niet wordt geciteerd, woorden scheidt. Een metateken is een spatie of een van de volgende tekens: |, &, ;, (, ), < , of >
blanco – Een spatie of tab-teken.
Voorbeelden:
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
Opmerkingen
Answer
!$
geeft je het laatst gebruikte commando voor die specifieke gebruiker ….
je kunt ook de geschiedenis van eerder gebruikte commandos vinden door history
commando te gebruiken … probeer het uit …
OPMERKING: voor een bepaalde gebruiker worden alle eerder gebruikte commandos opgeslagen in het bash-geschiedenisbestand.
Opmerkingen
- De andere antwoorden zijn juist. Deze is fout.
echo
iets als je ' niet zeker weet wat het ' zal doen.echo $(rm -rf /)
--no-preserve-root
-optie nodig, en als je de woorden " ziet, niet behouden " in een programma kun je maar beter goed nadenken over wat het doet.