Zkouším příkaz
$ b=5; echo `$b`;
-bash: 5: command not found
ale nevytiskne 5 tak, jak má. Co mi tady chybí?
Co znamená `(backquote/backtick) v příkazech? Zdá se, že `
vyhodnocuje příkazy uvnitř a nahrazuje je výstupem.
Text mezi backticky je spuštěn a nahrazen výstupem příkazu (mínus koncové znaky nového řádku a pozor, aby se chování Shell lišilo, když jsou na výstupu NUL znaky). Tomu se říká substituce příkazu , protože je nahrazena výstupem příkazu. Pokud tedy chcete tisknout 5, nemůžete použít backticks, můžete použít uvozovky, například echo "$b"
, Nebo jednoduše zrušit nabídku a použít echo $b
.
Jak vidíte, protože $b
Obsahuje 5, při použití backticků se bash
pokouší spustit příkaz 5
A protože takový příkaz neexistuje, selže s chybovou zprávou.
Chcete-li pochopit, jak funguje backticks, zkuste spustit toto:
$ A=`cat /etc/passwd | head -n1`
$ echo "$A"
cat /etc/passwd |head -n1
By měl vytisknout první řádek souboru /etc/passwd
. Ale protože používáme backticks, netiskne to na konzoli. Místo toho je uložen v proměnné A
. K tomu můžete opakovat $A
. Všimněte si, že efektivnější způsob tisku prvního řádku je pomocí příkazu head -n1 /etc/passwd
, Ale chtěl jsem zdůraznit, že výraz uvnitř backticků nemusí být jednoduchý.
Pokud tedy první řádek/etc/passwd je root:x:0:0:root:/root:/bin/bash
, Bude první příkaz dynamicky nahrazen bash na A="root:x:0:0:root:/root:/bin/bash"
.
Všimněte si, že tato syntaxe je Bourne Shell. Citace a útěky se z nich rychle stanou noční můrou, zvláště když je začnete hnízdit. Ksh představila alternativu $(...)
, která je nyní standardizovaná ( POSIX ) a podporována všemi shelly ( dokonce i Bourne Shell z Unixu v9). Takže byste dnes měli místo toho použít $(...)
, pokud nepotřebujete být přenosní do velmi starých Bourne shellů.
Také si všimněte, že výstupy `...`
A $(...)
podléhají rozdělení slov a generování názvů souborů, stejně jako proměnná expanze (v zsh, pouze rozdělení slov), takže by obecně muselo být uvedeno v seznamu kontexty.
Backtick dělá přesně to, co říkáte. Nastavili jste proměnnou na celé číslo. Když tuto proměnnou vložíte do backticků, bash se ji pokusí provést jako příkaz. Protože se nejedná o příkaz, zobrazí se chyba, kterou jste viděli.
To, co chcete udělat, je jednoduše:
$ b=5; echo $b
Chcete-li lépe porozumět backticks, porovnejte s:
$ b=5; a=`echo $b`; echo $a
5
Váš postup by měl krok za krokem vysvětlit.
$ b=5; echo `$b`;
b
na 5$b
(efektivně běží 5
)echo
es výstup výše uvedeného vyhodnocení.Takže ano, očekávaný výstup se očekává. Vyhodnocujete obsah proměnné, ne skutečný příkaz, o kterém jste si mysleli, že jste. Všechno, co vložíte do backticks, je simplay hodnoceno (spuštěno) v novém (sub) Shell.