Tekst między odwrotnymi wierszami jest wykonywany i zastępowany przez dane wyjściowe polecenia (minus końcowe znaki nowego wiersza i uwaga, że zachowanie powłoki różni się, gdy w wyniku są znaki NUL). Nazywa się to podstawieniem polecenia, ponieważ jest ono zastąpione wynikiem działania polecenia. Więc jeśli chcesz wydrukować 5, nie możesz używać odwrotnych znaków, możesz używać znaków cudzysłowu, jak echo "$b"
lub po prostu upuścić dowolną ofertę i użyć echo $b
.
Jak widać, ponieważ $b
zawiera 5, podczas korzystania z backticks bash
próbuje uruchomić polecenie, 5
a ponieważ nie ma takiego polecenia, nie powiedzie się komunikat o błędzie.
Aby zrozumieć, jak działają backticks, spróbuj uruchomić to:
$ A=`cat /etc/passwd | head -n1`
$ echo "$A"
cat /etc/passwd |head -n1
powinien wydrukować pierwszy wiersz /etc/passwd
pliku. Ale ponieważ używamy backticków, nie drukuje tego na konsoli. Zamiast tego jest przechowywany w A
zmiennej. Możesz to powtórzyć $A
. Zauważ, że bardziej wydajnym sposobem drukowania pierwszego wiersza jest użycie polecenia, head -n1 /etc/passwd
ale chciałem zwrócić uwagę, że wyrażenie w backticks nie musi być proste.
Więc jeśli pierwsza linia / etc / passwd to root:x:0:0:root:/root:/bin/bash
, pierwsza komenda zostanie dynamicznie zastąpiona przez bash do A="root:x:0:0:root:/root:/bin/bash"
.
Zauważ, że ta składnia dotyczy powłoki Bourne'a. Cytowanie i ucieczka szybko stają się koszmarem, zwłaszcza gdy zaczniesz je zagnieżdżać. Ksh wprowadził $(...)
alternatywę, która jest teraz znormalizowana ( POSIX ) i obsługiwana przez wszystkie powłoki (nawet powłokę Bourne'a z Uniksa v9). Dlatego powinieneś używać $(...)
zamiast tego, chyba że musisz być przenośny do bardzo starych pocisków Bourne'a.
Zauważ też, że wyniki `...`
i $(...)
podlegają dzieleniu słów i generowaniu nazw plików, podobnie jak rozwijanie zmiennych (tylko w Zsh, tylko dzielenie słów), więc ogólnie trzeba by je cytować w kontekście listowym.