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-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
Enterecho !$ Jar
Enter Nahoru Enter ; a -
echo Foo
Enterecho $_ 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 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ý.
echo
něco, pokud si ' nejste jisti, co to ' dělá.echo $(rm -rf /)
--no-preserve-root
a pokud uvidíte slova " no preserve " v programu si musíte pečlivě promyslet, co dělá.