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-15als 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 FooVoerecho !$ JarVoer Omhoog Voer in; en -
echo FooVoerecho $_ JarTyp 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.
echoiets 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.