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
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-15ha 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 során em>. 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 FooEnterecho !$ JarEnter Fel Enter ; és -
echo FooEnterecho $_ JarEnter 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-argumentszerint, általábanM-.-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.
echovalamit, ha ' nem biztos abban, hogy mit csinál ' ll.echo $(rm -rf /)--no-preserve-rootopció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.