Istnieją dwie składnie zastępowania poleceń: z nawiasami dolara i ze znakami wstecznymi. Działa top -p $(pidof init)
i top -p `pidof init`
daje tę samą moc wyjściową. Czy są to dwa sposoby robienia tego samego, czy też istnieją różnice?
Istnieją dwie składnie zastępowania poleceń: z nawiasami dolara i ze znakami wstecznymi. Działa top -p $(pidof init)
i top -p `pidof init`
daje tę samą moc wyjściową. Czy są to dwa sposoby robienia tego samego, czy też istnieją różnice?
Odpowiedzi:
W starym stylu backquotes ` `
traktują odwrotne ukośniki i zagnieżdżanie nieco inaczej. Nowy styl $()
interpretuje wszystko pomiędzy ( )
jako polecenie.
echo $(uname | $(echo cat))
Linux
echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat
działa, jeśli zagnieżdżone cudzysłowy są zastępowane:
echo `uname | \`echo cat\``
Linux
zabawa z odwrotnym ukośnikiem:
echo $(echo '\\')
\\
echo `echo '\\'`
\
Nowy styl $()
dotyczy wszystkich powłok zgodnych z POSIX .
Jak zauważył mouviciel , starsze style ` `
mogą być konieczne dla starszych powłok.
Oprócz technicznego punktu widzenia stary styl ` `
ma również wadę wizualną:
I like $(program) better than `program`
'`'`''`''`'`''`'
(i SE używa ` `
do własnych celów, pisanie tej odpowiedzi było uciążliwe :)
{ }
jest zwykle nazywany „nawiasami klamrowymi” lub „nawiasami klamrowymi” en.wikipedia.org/wiki/Braces_(punctuation)#Braces
`
jest martwy klawisz, więc muszę wpisać dwukrotne kliknięcie (coś, o czym zwykle zapominam, że nawet potrafię) lub cofnięcie, a następnie spację, która jest ból.
Oczywistą różnicą, którą obserwuję, jest to, że nie można zagnieżdżać tyknięć podczas gdy można zagnieżdżać $()
. Być może oba istnieją ze starszych powodów. Podobnie polecenia .
i source
są synonimami.
source
. Dash jest jednym z przykładów.
$(...)
i `...`
są standardowe (te ostatnie są przestarzałe), podczas gdy .
są standardowe, ale niesource
(t)csh
nie można ich zagnieżdżać. (t)csh
nie obsługują $(...)
jednak. Jednak obsługują source
(i nie .
).
$()
nie działa ze starą powłoką Bourne'a. Ale minęły lata, odkąd pracowałem ze starą skorupą Bourne'a.
Kolejna uwaga, $()
zużyje więcej zasobów systemowych niż backticks, ale jest nieco szybsza.
W opanowaniu skryptów powłoki Unixa Randal K. Michael wykonał test w rozdziale o nazwie „24 sposoby przetwarzania pliku linia po linii”.
$()
że twój skrypt jest o jeden bajt większy niż gdyby był używany `
(zakładając, że nie zagnieżdżasz ich i nie używasz odwrotnych ukośników). Co do tego, który byłby szybszy do przeanalizowania, byłby różny dla różnych powłok i byłby nieistotny jako nieistotny w porównaniu z kosztem utworzenia potoku i rozwidlenia procesu, który pociąga za sobą zastąpienie polecenia.
Aby dodać do tego, co powiedzieli tutaj inni, możesz użyć tylnych klawiszy, aby zasymulować wbudowane komentarze:
echo foo `# I'm a comment!` bar
Wyjście jest: foo bar
.
Aby uzyskać więcej informacji, zobacz następujące informacje: https://stackoverflow.com/a/12797512 (zwróć uwagę również na komentarze poniżej tego postu)
$()
Składnia nie będzie działać ze starym Bourne Shell.
Z nowszymi powłokami ` `
i $()
są równoważne, ale $()
jest o wiele wygodniejszy w użyciu, gdy trzeba zagnieżdżać wiele poleceń.
Na przykład :
echo $(basename $(dirname $(dirname /var/adm/sw/save )))
łatwiej jest pisać i debugować niż:
echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``