Istnieją dwa sposoby przechwytywania danych wyjściowych wiersza poleceń w bash
:
Legacy backticks powłoki Bourne'a
``
:var=`command`
$()
składnia (która, o ile wiem, jest specyficzna dla Bash lub przynajmniej nie jest obsługiwana przez stare powłoki niezgodne z POSIX, takie jak oryginalny Bourne)var=$(command)
Czy jest jakaś korzyść z używania drugiej składni w porównaniu do odwrotnych apostrofów? A może oba są w 100% równoważne?
$()
jest POSIX i jest obsługiwany przez wszystkie współczesne powłoki Bourne'a, np. ksh, bash, ash, dash, zsh, busybox, możesz to nazwać. (Nie tak nowoczesny jest Solaris/bin/sh
, ale w Solarisie powinieneś/usr/xpg4/bin/sh
zamiast tego użyć nowoczesnego ).$()
i odwrotnych apostrofów w aliasach. Jeśli maszalias foo=$(command)
w swoim.bashrc
tocommand
zostanie wykonane, gdy samo polecenie alias zostanie uruchomione podczas.bashrc
interpretacji. Zalias foo=`command`
,command
zostanie wykonane za każdym razem, gdy alias zostanie uruchomiony. Ale jeśli uciekniesz$
z$()
formularza (np.alias foo=\$(command)
), To również zostanie wykonane za każdym razem, gdy alias zostanie uruchomiony, zamiast podczas.bashrc
interpretacji. W każdym razie, o ile mogę stwierdzić na podstawie testów; Nie mogę znaleźć niczego w dokumentach bash, które wyjaśniają to zachowanie.`command`
command
jest wykonywane tylko raz. Sprawdziłem to: function aaa () {printf date; echo aaa >> ~ / test.txt; } alias test1 =aaa
. Funkcja aaa jest wykonywana tylko raz (po każdym logowaniu) bez względu na to, ile razy alias (test1
) był wykonywany. Użyłem .bashrc (w Debianie 10).Odpowiedzi:
Najważniejszą z nich jest umiejętność zagnieżdżania ich, wydawania poleceń w ramach poleceń, bez utraty poczytalności, próbując dowiedzieć się, czy jakaś forma ucieczki zadziała na backticks.
Przykład, choć nieco wymyślony:
co da ci listę wszystkich plików w
/dir
drzewie katalogów, które mają taką samą nazwę jak najwcześniejszy datowany plik tekstowy z grudnia 2011 (a) .Innym przykładem może być pobranie nazwy (nie pełnej ścieżki) katalogu nadrzędnego:
(a) Teraz, gdy określone polecenie może nie działać, nie testowałem jego funkcjonalności. Tak więc, jeśli zagłosujesz na mnie za tym, straciłeś z oczu zamiar :-) Jest to tylko ilustracja tego, jak możesz zagnieżdżać, a nie jako wolny od błędów fragment gotowy do produkcji.
źródło
Do whatever the heck you want with it.
” :-) W każdym razie jestem prawie pewien, że był to humor z DVK.Załóżmy, że chcesz znaleźć katalog lib odpowiadający temu, gdzie
gcc
jest zainstalowany. Masz wybór:Pierwsza jest łatwiejsza niż druga - skorzystaj z pierwszej.
źródło
x=$(f); x=`f`
zachowują się tak samo jakx="$(f)"; x="`f`"
. Natomiast przypisanie tablicyx=($(f)); x=(`f`)
zrobić wykonać podział na$IFS
bohaterów jak spodziewanych podczas wywoływania polecenia. Jest to wygodne (x=1 2 3 4
nie ma sensu), ale niespójne.x=$(f)
pracy bez cudzysłowów. Powinienem był być bardziej szczegółowy; Proponowałem użycielibdir=$(dirname "$(dirname "$(which gcc)")")/lib
(cudzysłowy wokół wewnętrznych podstawień poleceń). Jeśli pozostaniesz bez cytowania, nadal podlegasz zwykłemu podziałowi na słowa i rozszerzaniu globów.Backticks (
`...`
) to starsza składnia wymagana tylko przez najstarsze niezgodne z POSIX powłoki burne i$(...)
jest POSIX i jest bardziej preferowana z kilku powodów:Backslashes (
\
) wewnątrz backticks są obsługiwane w nieoczywisty sposób:Zagnieżdżone cytowanie wewnątrz
$()
jest znacznie wygodniejsze:zamiast:
lub napisz coś takiego:
ponieważ
$()
używa zupełnie nowego kontekstu cytowaniaktóry nie jest przenośny, ponieważ powłoki Bourne'a i Korna wymagałyby tych odwrotnych ukośników, podczas gdy Bash i Dash nie.
Składnia zastępowania poleceń zagnieżdżania jest łatwiejsza:
niż:
ponieważ
$()
wymusza zupełnie nowy kontekst cytowania, więc każde podstawienie polecenia jest chronione i może być traktowane samodzielnie, bez szczególnej uwagi na cytowanie i ucieczkę. Kiedy używasz grawisów, staje się brzydszy i brzydszy po dwóch i więcej poziomach.Jeszcze kilka przykładów:
Rozwiązuje problem niespójnego zachowania podczas używania cudzysłowów:
echo '\$x'
wyjścia\$x
echo `echo '\$x'`
wyjścia$x
echo $(echo '\$x')
wyjścia\$x
Składnia Backticks ma historyczne ograniczenia dotyczące zawartości osadzonego polecenia i nie może obsługiwać niektórych prawidłowych skryptów zawierających cudzysłowy, podczas gdy nowszy
$()
formularz może przetwarzać dowolny prawidłowy osadzony skrypt.Na przykład te prawidłowe skrypty osadzone nie działają w lewej kolumnie, ale działają na prawej IEEE :
Dlatego składnia podstawiania poleceń z
$
prefiksem powinna być metodą preferowaną, ponieważ jest wizualnie przejrzysta dzięki przejrzystej składni (poprawia czytelność dla ludzi i maszyn), jest zagnieżdżona i intuicyjna, jej wewnętrzne parsowanie jest oddzielne, a także jest bardziej spójne (z wszystkie inne rozszerzenia, które są analizowane z poziomu cudzysłowów), w których jedynym wyjątkiem są grawerowane napisy, a znak można łatwo zakamuflować, gdy sąsiaduje, co czyni go jeszcze trudniejszym do odczytania, zwłaszcza w przypadku małych lub nietypowych czcionek.`
"
Źródło: Dlaczego jest
$(...)
preferowany w stosunku do`...`
(grawisów)? w BashFAQZobacz też:
źródło
Od człowieka bash:
źródło
Oprócz innych odpowiedzi
wyróżnia się wizualnie lepiej niż
Backticks za bardzo przypominają apostrofy; zależy to od używanej czcionki.
(I, jak właśnie zauważyłem, znaczniki odwrotne są znacznie trudniejsze do wprowadzenia w próbkach kodu wbudowanego).
źródło
$
(
i)
niż dla backticka; YMMV.$()
umożliwia zagnieżdżanie.Myślę, że backticks na to nie pozwala.
źródło
out=`echo today is \`date\``
.To standard POSIX definiuje
$(command)
formę podstawiania poleceń. Większość używanych obecnie powłok jest zgodna z POSIX i obsługuje tę preferowaną formę zamiast archaicznej notacji odwrotnego znaku. Sekcja podstawiania poleceń (2.6.3) w dokumencie języka powłoki opisuje to:źródło
To jest pytanie starsze, ale wymyśliłem doskonały przykład
$(...)
ponad`...`
.Używałem zdalnego pulpitu do systemu Windows z uruchomionym cygwin i chciałem iterować po wyniku polecenia. Niestety, wpisanie znaku backtick było niemożliwe, ani z powodu zdalnego pulpitu, ani samego cygwina.
Rozsądnie jest założyć, że znak dolara i nawiasy będą łatwiejsze do wpisania w tak dziwnych ustawieniach.
źródło