Wat betekent! $?

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

  • Het is ' over het algemeen veilig om te proberen echo iets als je ' niet zeker weet wat het ' zal doen.
  • @Shadur, niet altijd. echo $(rm -rf /)
  • @cjm Tenzij je ' op een heel oud systeem zit, ' Ik heb de --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.
  • @WChargin Wees heel voorzichtig in de veronderstelling dat " echt oud " en " geen Linux / geen GNU coreutils gebruiken " zijn hetzelfde; ze zijn ' t.

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 Voer echo !$ Jar Voer Omhoog Voer in; en

  • echo Foo Voer echo $_ 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 aan M-..
  • @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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *