Mit jelent! $?

Követem egy oktatóanyagot, és megemlíti a parancs futtatását:

sudo chmod 700 !$ 

Nem ismerem a következőt: !$. Mit jelent?

Megjegyzések

  • ' általában biztonságos, ha megpróbálod echo valamit, ha ' nem biztos abban, hogy mit csinál ' ll.
  • @Shadur, nem mindig. echo $(rm -rf /)
  • @cjm Kivéve, ha ' valóban régi rendszert használ, akkor ' ll a --no-preserve-root opcióra van szükség, és ha látja a " szavakat, akkor nincs megőrzés " egy programban jobb, ha alaposan átgondolja, mit csinál.
  • @WChargin Legyen nagyon körültekintő, ha feltételezi, hogy " valóban régi " és " nem Linux / nem használ GNU coreutils " ugyanaz; nem ' t.

Válasz

Alapvetően ez “az előző parancs utolsó argumentuma.

!$ az előző parancs” vége ” Vizsgáljuk meg a következő példát: Először keresünk egy szót egy fájlban:

grep -i joe /some/long/directory/structure/user-lists/list-15 

ha joe szerepel a felhasználói listán, el akarjuk távolítani belőle Vagy feloldhatjuk a vi-t azzal a hosszú könyvtárfával, mint argumentummal, vagy olyan egyszerűen, mint vi !$ Melyik bash bővül ki:

vi /some/long/directory/structure/user-lists/list-15 

( forrás ; egyébként hasznos útmutató)


Semmit sem ér a különbség a !$ token és a $_ speciális shell változó között . Valójában mindkettő kibővül az előző parancs utolsó argumentumáig. A !$ azonban kibővül a előzmények kibővítése során, míg a $_ kibővül a paraméterbővítés . Ennek egyik fontos következménye, hogy a !$ használatakor a kibővített parancs mentésre kerül az előzményekbe.

Például fontolja meg a billentyűleütéseket

  • echo Foo Enter echo !$ Jar Enter Fel Enter ; és

  • echo Foo Enter echo $_ Jar Enter Fel Enter.

(Az egyetlen megváltozott karakter a $! és $_ középen.)

Az előbbiben a Fel megnyomásakor a parancssor a következőt olvassa: echo Foo Jar, így az stdout-ba írt utolsó sor: Foo Jar.

Utóbbiban, amikor megnyomja a Fel , a parancssor a következőt írja: echo $_ bar, de most a $_ értéke más, mint korábban – sőt, A $_ most Jar, így az stdout-hoz írt utolsó sor Jar Jar.

Egy másik következmény az, hogy a _ felhasználható más paraméterbővítésekben, például a parancsok sorrendjében

printf "%s " isomorphism printf "%s\n" ${_%morphism}sceles 

nyomtat isomorphism isosceles. De “nincs analóg” ${!$%morphism} “bővítés.

A Bash bővítési fázisairól további információt a EXPANSION

szakasz

szakasza (ezt az online kiadásban Shell kibővítésnek hívják ). A HISTORY EXPANSION szakasz külön van.

Megjegyzések

  • Szép. Jó tudni. Emellett jó dolog ott ' s Stack Exchange. ' nehéz a Google-ben keresni például !$
  • BTW, a parancssorba beillesztheti az előző parancs utolsó argumentumát insert-last-argument szerint, általában M-. -hez kötve.
  • @Andrew, kérjük, ne felejtse el elfogadni ezt, ha válaszol a kérdésére. A megjegyzések közzététele helyett az elfogadás és a pozitív szavazat az, hogy a köszönet hogyan fejeződik be az SE hálózaton, lásd: itt a " hivatalos " álláspont.
  • @Andrew FYI, a Google-ben a " bash bang dollar " és tisztességes eredményeket ért el, beleértve ezt a linket a harmadik listaként.
  • @terdon Tegnap este megpróbáltam elfogadni a választ, de olyan gyors volt, hogy kénytelen várni, hogy elfogadja.

Válasz

Szigorúan beszélve !$ az utolsó parancs utolsó szava az előzmények listájáról.

szó – A héj egységként kezelt karakterek sora. A szavak nem tartalmazhatnak nem idézett metakaraktereket.

metakarakter – Olyan karakter, amely nem idézett állapotban elválasztja a szavakat. A metakarakter üres vagy a következő karakterek egyike: |, &, ;, (, ), < vagy >

üres – szóköz vagy tabulátor karakter.

Példák:

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 

Megjegyzések

Válasz

!$ megadja a legutóbb használt parancsot az adott felhasználó számára ….

a history paranccsal megtalálhatja a korábban használt parancsok előzményeit is … próbálja ki ….

MEGJEGYZÉS: Egy adott felhasználó esetében az összes korábban használt parancsot a bash előzmények fájlja tárolja.

Megjegyzések

  • A többi válasz helyes. Ez téves.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük