Co to jest $ () w poleceniu?

18

Co zawiera $()komenda powłoki Linuxa?

Na przykład:

chmod 777 $(pwd)
Sudoer
źródło
1
Zauważ, że nie ma czegoś takiego jak polecenie powłoki linii . Istnieje wiele aplikacji powłoki dostępnych dla systemu Linux.
Stéphane Chazelas

Odpowiedzi:

21

Jest bardzo podobny do backticks ''.

Nazywa się to podstawieniem poleceń ( specyfikacja POSIX ) i wywołuje podpowłokę. Polecenie w nawiasach klamrowych $()lub między nimi (``) jest wykonywane w podpowłoce, a dane wyjściowe są następnie umieszczane w pierwotnym poleceniu.

W przeciwieństwie do backticksa, $(...)forma może być zagnieżdżona. Możesz więc użyć podstawienia polecenia w innym podstawieniu.

Istnieją również różnice w zakresie znaków ucieczkowych w obrębie podstawienia. Wolę $(...)formę.

chaos
źródło
4
można również zagnieżdżać wsteczne. Zauważ, że końcowe znaki nowego wiersza są usuwane z danych wyjściowych polecenia.
Stéphane Chazelas
2
@ StéphaneChazelas jak zagnieżdżać backticks? Masz na myśli ucieczkę ekstazy?
chaos
3
Tak: jak zecho `echo \`echo foo\`` bar
Stéphane Chazelas
1
Jakieś oficjalne wzmianki, że backticks są przestarzałe?
vinc17
1
Znalazłem tę odpowiedź: unix.stackexchange.com/questions/126927/... wygląda na to, że nie są przestarzałe. Zmieniłem odpowiedź, dzięki
chaos
5

W POSIX lub POSIX-jak muszli ( ksh, bash, ash, zsh, yash...), to jest jak ``: wewnętrzna komenda $()jest wykonywana i zastąpione przez standardowe wyjście. Dzielenie słów i generowanie nazw plików jest wykonywane, chyba że $()znajduje się w cudzysłowie. A zatem

chmod 777 $(pwd)

należy zastąpić:

chmod 777 "$(pwd)"

aby uniknąć podziału słów i generowania nazw plików w bieżącej ścieżce katalogu roboczego.

Lub nawet lepiej (z wyjątkiem niektórych powłok, takich jak zsh, w przypadku zmiany nazwy katalogu):

chmod 777 "$PWD"

Since $PWDjest specjalną zmienną, która przechowuje ścieżkę do bieżącego katalogu roboczego w powłokach POSIX.

Lub nawet lepiej:

chmod 777 .

Ponieważ .wpis w bieżącym katalogu jest dowiązaniem twardym do samego katalogu.

vinc17
źródło
2

To $()służy do wykonywania polecenia głównie wewnątrz innego polecenia.

chmod 777 $(pwd)

pwdpolecenie podaje bieżący katalog roboczy. Kiedy więc wszystko zostanie wykonane, dane wyjściowe pwd zastąpią jego pozycję i będą służyć jako argument chmod, w wyniku czego cały twój obecny katalog roboczy otrzyma pozwolenie, 777które, jak sądzę, nigdy nie powinno być używane w środowisku produkcyjnym;).

początkujący
źródło