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?
shell
command-line
command-substitution
tshepang
źródło
źródło
Odpowiedzi:
W starym stylu backquotes
` `
traktują odwrotne ukośniki i zagnieżdżanie nieco inaczej. Nowy styl$()
interpretuje wszystko pomiędzy( )
jako polecenie.działa, jeśli zagnieżdżone cudzysłowy są zastępowane:
zabawa z odwrotnym ukośnikiem:
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 :)źródło
{ }
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.
isource
są synonimami.źródło
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ęłylata,odkąd pracowałem ze starą skorupą Bourne'a.źródło
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”.
źródło
$()
ż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:
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)
źródło
$()
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 :
łatwiej jest pisać i debugować niż:
źródło