Co to znamená! $?

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

  • Je ' obecně bezpečné echo něco, pokud si ' nejste jisti, co to ' dělá.
  • @Shadur, ne vždy. echo $(rm -rf /)
  • @cjm Pokud ' nepoužíváte opravdu starý systém, ' Budu tam potřebovat možnost --no-preserve-root a pokud uvidíte slova " no preserve " v programu si musíte pečlivě promyslet, co dělá.
  • @WChargin Buďte velmi opatrní za předpokladu, že " opravdu starý " a " ne Linux / nepoužívající GNU coreutils " jsou totéž; nejsou ' t.

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-15 

pokud 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 Foo Enter echo !$ Jar Enter Nahoru Enter ; a

  • echo Foo Enter echo $_ Jar Zadejte 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 na M-..
  • @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ý.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *