it-swarm-eu.dev

Porozumění backticku (`)

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.

37
coolcric

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.

55

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
11
terdon

Váš postup by měl krok za krokem vysvětlit.

$ b=5; echo `$b`;
  1. nastaví proměnnou b na 5
  2. vyhodnocuje $b (efektivně běží 5)
  3. echoes 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.

8
gertvdijk