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
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.
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í.
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 hostnameX
a 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 :)
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.
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ář.
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ý: $()
.
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í.
thedate=$(date)
Mohli bychom potom vytisknout výsledek: 'Datum je% s\n' "$ thedate" ".
$()
.date
.$(date)
, jehož výstupem je substituce.printf
, na příkaz výše.