it-swarm-eu.dev

Co znamená `(backquote / backtick) v příkazech?

Narazil jsem na následující příkaz:

Sudo chown `id -u` /somedir

a zajímalo by mě: jaký je význam symbolu `. Všiml jsem si například, že zatímco výše uvedený příkaz funguje dobře, níže uvedený příkaz:

Sudo chown 'id -u' /somedir
189
gws

Toto je backtick . Backtick není znaménko uvozovky. Má velmi zvláštní význam. Všechno, co napíšete mezi backticks, je Shell vyhodnoceno (provedeno) před hlavním příkazem (jako ve vašich příkladech chown) a tento příkaz používá výstup tohoto spuštění. , jako byste zadali tento výstup na tomto místě v příkazovém řádku.

No a co

Sudo chown `id -u` /somedir

efektivně běží (v závislosti na vaše uživatelské ID) je:

Sudo chown 1000 /somedir
  \    \     \     \
   \    \     \     `-- the second argument to "chown" (target directory)
    \    \     `-- your user ID, which is the output of "id -u" command
     \    `-- "chown" command (change ownership of file/directory)
      `-- the "run as root" command; everything after this is run with root privileges

Podívejte se na tato otázka , abyste zjistili, proč v mnoha situacích není vhodné používat backticks.

Btw, pokud jste někdy chtěli použít backtick doslova, např. v řetězci, můžete mu uniknout umístěním zpětného lomítka (\) před tím.

231
rozcietrzewiacz

Chtěl bych zde přidat několik dalších bodů.

Backtick `…` Se ve skutečnosti nazývá substituce příkaz . Účelem substituce příkazu je vyhodnotit příkaz, který je umístěn uvnitř backticku, a poskytnout jeho výsledek jako argument skutečného příkazu.

Substituci příkazu lze provést dvěma způsoby, jeden používá $(…) a druhý je `…`. Oba fungují stejně, ale forma $(…) je moderním způsobem a má větší přehlednost a čitelnost.

A tak

Sudo chown $(id -u) /somedir

může být výhodnější než ostatní.

A ještě jednu věc, kterou si musíte poznamenat, je vztah substituce příkaz s pravidla pro citování bash , jak je uvedeno v bash document .

Pokud se substituce objeví ve dvojitých uvozovkách, rozdělení výsledků a rozšíření názvu souboru se u výsledků neprovádí.

73
Kannan Mohan

Jedna poznámka o objasnění se zřídka vztahuje:

Backticks (někdy také nazývaný Graves, protože se používá jako běžný přízvuk ve francouzštině a dalších jazycích) nahrazují pouze standardní výstup, ale ne standardní chybu.

Chcete-li tedy pokračovat v předchozím příkladu:

file `which hostname`

bude fungovat podle očekávání, ale v:

file `which hostnameX`

which vrátí chybu a tento výstup přejde na standardní chybu, namísto nahrazení na příkazovém řádku vedle file; nebude existovat žádný standardní výstup, který můžete potvrdit spuštěním:

which hostnameX

which hostnameX 2>/dev/null

V tomto případě,

file `which hostnameX` 

vygeneruje dvě chybové zprávy (první, kvůli which hostnameXa druhý hned za prvním, kvůli samotnému souboru, který zjistí, že název souboru chybí, a tak celý příkaz

se v zásadě sníží na pouhých:

file

což je samozřejmě špatné použití a vrátí chybu použití.

(Pokud si to chcete ověřit sami, můžete vyzkoušet:

file `which hostnameX 2>/dev/null`    # just the file-command bad-usage error msg is printed

file `which hostnameX 2>/dev/null` 2>/dev/null  # now nothing is printed on the screen :)
10
Dave K

Backtick `spustí obsah uzavřeného řetězce, takže něco takového

file `which hostname`

zjistí cestu k příkazu hostname a poté řekne, jak byl vytvořen.

Příkaz, který vložíte do své otázky, spustí id -u získat efektivní ID uživatele a poté změnit vlastnictví/somedir na tohoto uživatele.

4
Julian

Tento symbol znamená, že cokoli uvnitř je interpretováno jako výsledek tohoto příkazu.

například:

$ls /home
one two
$pwd
/usr/three
$cp `pwd` /home
$ls /home
one two three

Výše uvedené výsledky zkopírují do adresáře three do mého /home adresář.

2
Hanan N.

Backticks se podobají substituci příkazu. Tato syntaxe backticks je archaická a je známo, že znak dolaru se dvěma závorkami je běžný: $().

Co je substituce příkazů?

Substituce příkazu je jediná operace s vyhrazenou syntaxí k provedení příkazu i k uložení jeho výstupu do proměnné pro pozdější použití.

Příklad s datem:

thedate=$(date)

Mohli bychom potom vytisknout výsledek: 'Datum je% s\n' "$ thedate" ".

  1. Syntaxe substituce příkazu je $().
  2. Samotný příkaz je date.
  3. Spojením obou dostaneme $(date), jehož výstupem je substituce.
  4. Zobrazíme výstupní hodnotu přidrženou proměnnou s printf, na příkaz výše.
1
user9303970