Existují určité příkazy nebo triky, které začnete používat jako systémový správce, které jednoduše začleníte do svého arzenálu a nikdy nepřestanete do hloubky analyzovat všechny možnosti nebo jejich alternativy.
Pro mě je jedním z těchto triků operátor backtick. Používal jsem to poměrně často, když jsem programoval v Perlu (který dnes nepoužívám, ale zdá se, že má stále svůj věrný fanklub - podívejte se na tuto anketu). V mých skriptech v Perlu bych použil operátor backtick ke spuštění příkazu v operačním systému a vrátil výstup, aby pokračovala logika ve skriptu.
[ Také by se vám mohlo líbit: Skriptování Bash:Jak zapisovat data do textových souborů ]
Operátor backtick je k dispozici i ve skriptech shellu, a protože je tak snadné jej kombinovat s jinými příkazy, začal jsem ho hodně používat. Existuje však více „doporučený“ způsob, jak udělat totéž, pomocí $
operátor závorek.
V tomto článku vám ukážu výhody a nevýhody každého z nich pro použití ve skriptech shellu.
Základní funkce zpětných zatržení
Otevřená skupina má definici operátora backtick, oficiálně označovaného jako substituce příkazů. Tento operátor není znak jednoduchých uvozovek, ale jiný znak známý jako vážný přízvuk (`
).
Myšlenka je jednoduchá:
❯ echo "There are `ls | wc -l` files in this directory"
There are 3 files in this directory
Mám velmi jednoduchou skupinu příkazů ls | wc -l
které používám k výpisu a počítání počtu souborů v aktuálním adresáři. Mohu to snadno provést interaktivně a přesně vidím, jaký je výsledek. Poté jej mohu vložit do svého hlavního echo
příkaz.
Ve skriptu shellu bych jistě mohl provést totéž, přiřadit výsledek mého příkazu count k proměnné a poté proměnnou použít později.
❯ file_count=`ls | wc -l`
❯ echo "There are $file_count files in this directory"
There are 3 files in this directory
A samozřejmě by bylo lepší, kdyby nápad byl znovu použít hodnota nebo pokud operace, která se má provést, nebyla tak jednoduchá jako v mém příkladu.
Vkládání příkazů pomocí backticks je to, co bych klasifikoval jako "rychlé a špinavé triky."
Parens $
Stejného výsledku můžete dosáhnout nahrazením zpětných zaškrtnutí znakem $
parens, jako v příkladu níže:
❯ echo "There are $(ls | wc -l) files in this directory"
There are 3 files in this directory
Zde je další příklad, stále velmi jednoduchý, ale trochu realističtější. Potřebuji něco vyřešit v mých síťových připojeních, takže jsem se rozhodl ukázat svůj celkový počet a čekající připojení minutu po minutě.
❯ cat netinfo.sh
#!/bin/bash
while true
do
ss -an > netinfo.txt
connections_total=$(cat netinfo.txt | wc -l)
connections_waiting=$(grep WAIT netinfo.txt | wc -l)
printf "$(date +%R) - Total=%6d Waiting=%6d\n" $connections_total $connections_waiting
sleep 60
done
❯ ./netinfo.sh
22:59 - Total= 2930 Waiting= 977
23:00 - Total= 2923 Waiting= 963
23:01 - Total= 2346 Waiting= 397
23:02 - Total= 2497 Waiting= 541
Nezdá se to být obrovské rozdíl, že? Jen jsem musel upravit syntaxi. Tyto dva přístupy mají určité důsledky. Pokud jste jako já, kdo automaticky používá zpětné zarážky, aniž by mrkl, pokračujte ve čtení.
Ukončení podpory a doporučení
Ukončení podpory zní to jako špatné slovo a v mnoha případech to může být opravdu špatné.
Když jsem zkoumal vysvětlení pro operátor backtick, našel jsem několik diskuzí na téma „jsou operátory backtick zastaralé?“
Krátká odpověď zní:Ne ve smyslu „na pokraji, kdy se stane nepodporovaným a přestane fungovat“. Je však třeba se vyvarovat zpětných zaškrtnutí a nahradit je $
syntaxe závorek.
Hlavní důvody pro to jsou (v žádném konkrétním pořadí):
1. Operátoři backticků mohou být nepořádek, pokud interní příkazy také používají backticks.
- Budete muset opustit vnitřní zpětná zaškrtnutí, a pokud máte v příkazech nebo ve výsledcích jednoduché uvozovky, čtení a odstraňování problémů se skriptem může být obtížné.
- Pokud začnete přemýšlet o vnoření operátory backtick uvnitř jiných operátorů backtick, věci nebudou fungovat podle očekávání nebo nebudou fungovat vůbec. Neobtěžujte se.
2. $
Parens operátor je bezpečnější a předvídatelnější.
- Co kódujete v
$
Parens operátor je považován za skript shellu. Syntakticky je to totéž jako mít tento kód v textovém souboru, takže můžete očekávat, že vše, co byste zakódovali v izolovaném shell skriptu, by zde fungovalo.
Zde je několik příkladů rozdílů v chování mezi backticks a $
rodiče:
❯ echo '\$x'
\$x
❯ echo `echo '\$x'`
$x
❯ echo $(echo '\$x')
\$x
Můžete najít další příklady rozdílů mezi zpětnými zatrženími a $
chování rodičů zde.
[ Cheat sheet zdarma:Získejte seznam linuxových nástrojů a příkazů pro správu serverů a sítí. ]
Koneckonců
Pokud porovnáte tyto dva přístupy, zdá se logické si myslet, že byste měli vždy/pouze používat $
přístup rodičů. A můžete si myslet, že operátory backtick používají pouze správci systému ze starší éry.
No, to může být pravda, protože někdy používám věci, které jsem se naučil už dávno, a v jednoduchých situacích to moje „svalová paměť“ prostě zakóduje za mě. U příkazů ad-hoc, o kterých víte, že neobsahují žádné ošklivé znaky, můžete použít zpětné zaškrtnutí. Ale pro cokoli, co je trvalejší nebo složitější/sofistikovanější, použijte prosím $
přístup rodičů.