Wypróbowuję polecenie
$ b=5; echo `$b`;
-bash: 5: command not found
ale nie drukuje 5 tak, jak powinno. Czego tu brakuje?
Co oznacza `(backquote / backtick) w poleceniach? zdaje się mówić, że `
ocenia polecenia wewnątrz i zamienia je na dane wyjściowe.
bash
shell
command-substitution
coolcric
źródło
źródło
Odpowiedzi:
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 backticksbash
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:
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 wA
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 doA="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.źródło
you can use quotation marks, like echo "$b"
=> czy „” robi coś specjalnego? Wygląda na to,echo $b
że zadziała równie dobrze.echo
polecenie nie dba o liczbę argumentów, które dostaje, więc jeślib
ma w nim trochę spacji, otrzyma wiele argumentów i nadal je wydrukuje. Nie może tak być w przypadku innych poleceń (szczególnie gdy zmienna nie jest ustawiona), więc zwykle otaczam zmienne cudzysłowami.(POSIX)
był link do faktycznego standardu.Backtick wykonuje dokładnie to, co mówisz. Ustawiłeś zmienną na liczbę całkowitą. Kiedy umieścisz tę zmienną w backticksie, bash spróbuje wykonać ją jako polecenie. Ponieważ nie jest to polecenie, pojawia się wyświetlony błąd.
To, co chcesz zrobić, to po prostu:
Aby lepiej zrozumieć backticks, porównaj z:
źródło
Idąc krok po kroku, twoja linia powinna to wyjaśnić.
b
na 5$b
(efektywnie działa5
)echo
Jest to wynik powyższej oceny.Tak więc, oczekiwany wynik jest oczekiwany. Oceniasz zawartość zmiennej, a nie rzeczywiste polecenie, o którym myślałeś, że jesteś. Wszystko, co umieścisz w backtickach, jest oceniane (uruchamiane) w nowej (pod) powłoce.
źródło