Sleduji výukový program a zmiňuje se o spuštění tohoto příkazu:
sudo chmod 700 !$
Nejsem obeznámen s !$. Co to znamená?
Komentáře
odpověď
v zásadě to „je poslední argument předchozího příkazu.
!$je“ konec „předchozího příkazu . Zvažte následující příklad: Začneme hledáním slova v souboru:grep -i joe /some/long/directory/structure/user-lists/list-15pokud je joe v tomto seznamu uživatelů, chceme ho z něj odebrat . Můžeme buď spustit vi s tímto dlouhým adresářovým stromem jako argumentem, nebo jednoduše jako
vi !$Který bash se rozšíří na:vi /some/long/directory/structure/user-lists/list-15
( zdroj ; mimochodem praktický průvodce)
Nestojí za to rozdíl mezi tímto !$ tokenem a speciální proměnnou prostředí $_ . Ve skutečnosti se oba rozbalí na poslední argument předchozího příkazu. !$ se však rozšíří během rozšíření historie , zatímco $_ se rozšíří během rozšíření parametrů . Jedním z důležitých důsledků toho je, že když použijete !$, příkaz rozšířený se uloží do vaší historie.
Například zvažte stisknutí kláves
-
echo FooEnterecho !$ JarEnter Nahoru Enter ; a -
echo FooEnterecho $_ JarZadejte Nahoru Zadejte .
(Změněny jsou pouze znaky $! a $_ uprostřed.)
V prvním případě, když stisknete nahoru , příkazový řádek čte echo Foo Jar, takže poslední řádek zapsaný do stdout je Foo Jar.
V druhém případě, když stisknete Nahoru , příkazový řádek čte echo $_ bar, ale nyní má $_ jinou hodnotu než dříve – ve skutečnosti $_ je nyní Jar, takže poslední řádek zapsaný do stdout je Jar Jar.
Dalším důsledkem je, že _ lze použít v dalších rozšířeních parametrů, například v posloupnosti příkazů
printf "%s " isomorphism printf "%s\n" ${_%morphism}sceles
vytiskne isomorphism isosceles. Neexistuje však žádná obdobná „${!$%morphism}“ expanze.
Další informace o fázích expanze v Bash naleznete v EXPANSION sekce man 1 bash (v online vydání se tomu říká Shell Expansions ). HISTORY EXPANSION sekce je samostatná.
Komentáře
- Pěkné. Dobré vědět. Také dobrá věc tam ' s Stack Exchange. ' je těžké hledat na Googlu něco jako
!$ - BTW, na příkazovém řádku můžete vložit poslední argument předchozího příkazu pomocí
insert-last-argument, obvykle vázaného naM-.. - @Andrew nezapomeňte to přijmout, pokud odpoví na vaši otázku. Přijímání a hlasování, nikoli zveřejňování komentářů, vyjadřuje poděkování v síti SE, viz zde pro " oficiální " postoj.
- @Andrew FYI, hledal jsem na Googlu " bash bang dollar " a dosáhl slušných výsledků, včetně tohoto odkazu jako třetího seznamu.
- @terdon Zkoušel jsem přijmout odpověď včera, ale bylo to tak rychlé, že jsem nucen počkat, až to přijme.
odpověď
přísně vzato !$ je poslední slovo posledního příkazu ze seznamu historie.
slovo – Posloupnost znaků, které shell považuje za jednotku. Slova nemusí obsahovat nekótované metaznaky.
metaznak – znak, který při nekotaci odděluje slova. Metaznak je prázdný znak nebo jeden z následujících znaků: |, &, ;, (, ), < nebo >
prázdné – znak mezery nebo tabulátoru.
Příklady:
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
Komentáře
Odpověď
!$ vám dá poslední použitý příkaz pro konkrétního uživatele ….
Historii dříve použitých příkazů najdete také pomocí příkazu history … vyzkoušet ….
POZNÁMKA: U konkrétního uživatele budou všechny dříve použité příkazy uloženy v souboru historie bash.
Komentáře
- Ostatní odpovědi mají pravdu. Tenhle je špatný.
echoněco, pokud si ' nejste jisti, co to ' dělá.echo $(rm -rf /)--no-preserve-roota pokud uvidíte slova " no preserve " v programu si musíte pečlivě promyslet, co dělá.