Berapakah $ () dalam sebuah perintah?

18

Apa yang ada $()di Perintah Shell Linux?

Sebagai contoh:

chmod 777 $(pwd)
Sudoer
sumber
1
Perhatikan bahwa tidak ada perintah shell line . Ada sejumlah aplikasi shell yang tersedia untuk Linux.
Stéphane Chazelas

Jawaban:

21

Ini sangat mirip dengan backticks ``.

Ini disebut substitusi perintah ( spesifikasi posix ) dan memanggil subkulit. Perintah di kurung $()atau di antara backticks (``) dieksekusi dalam sebuah subkulit dan output kemudian ditempatkan pada perintah asli.

Berbeda dengan backticks, $(...)formulir dapat disarangkan. Jadi Anda bisa menggunakan substitusi perintah di dalam subtitusi lain.

Ada beberapa perbedaan dalam melarikan diri karakter dalam substitusi. Saya lebih suka $(...)formulir.

kekacauan
sumber
4
backticks dapat disarangkan juga. Perhatikan bahwa trailing karakter baris baru dihapus dari output perintah.
Stéphane Chazelas
2
@ StéphaneChazelas bagaimana backticks dapat bersarang? Maksud Anda dengan melarikan diri secara eksesif?
kekacauan
3
Ya: suka denganecho `echo \`echo foo\`` bar
Stéphane Chazelas
1
Adakah referensi resmi yang mengatakan bahwa backticks sudah usang?
vinc17
1
Ditemukan jawaban ini: unix.stackexchange.com/questions/126927/... tampaknya tidak usang. Mengubah jawaban saya, terima kasih
kekacauan
5

Dalam POSIX atau POSIX-seperti kerang ( ksh, bash, ash, zsh, yash...), itu seperti ``: perintah dalam $()dijalankan dan digantikan oleh keluaran standar. Pemisahan kata dan pembuatan nama file dilakukan kecuali $()ada di dalam tanda kutip ganda. Jadi

chmod 777 $(pwd)

harus diganti dengan:

chmod 777 "$(pwd)"

untuk menghindari pemisahan kata dan pembuatan nama file pada jalur direktori kerja saat ini.

Atau bahkan lebih baik (kecuali di bawah beberapa shell, seperti zsh, kalau-kalau direktori telah diganti nama):

chmod 777 "$PWD"

Karena $PWDmerupakan variabel khusus yang menyimpan path ke direktori yang aktif di shell POSIX.

Atau lebih baik lagi:

chmod 777 .

Karena .entri dalam direktori saat ini adalah tautan keras ke direktori itu sendiri.

vinc17
sumber
2

Ini $()digunakan untuk mengeksekusi perintah sebagian besar di dalam beberapa perintah lainnya.

chmod 777 $(pwd)

pwdperintah memberikan direktori kerja saat ini. Jadi, ketika semuanya dieksekusi, output pwd akan menggantikan posisinya dan berfungsi sebagai argumen chmod, dan hasilnya adalah semua direktori kerja Anda saat ini mendapatkan izin 777yang saya kira tidak boleh digunakan dalam lingkungan produksi;).

pemula
sumber