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-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 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 Foo
Enterecho !$ Jar
Enter Fel Enter ; és -
echo Foo
Enterecho $_ 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á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.
echo
valamit, ha ' nem biztos abban, hogy mit csinál ' ll.echo $(rm -rf /)
--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.