GNU/Linux >> Belajar Linux >  >> Linux

Apakah Saya Perlu Mengutip Substitusi Perintah Saat Menetapkan Outputnya Ke Variabel??

Pertanyaan ini sudah memiliki jawaban di sini :Kapan kutip ganda diperlukan?

(1 jawaban)
Tutup 4 tahun yang lalu.

Saya cenderung mengutip substitusi perintah seperti yang ditunjukkan di bawah ini bahkan ketika menetapkan outputnya ke variabel:

var="$(command)"

Apakah itu benar-benar dibutuhkan? Kapan itu pecah? Jawaban yang diterima di sini mengklaim:

DIRNAME="$(dirname $FILE)" tidak akan melakukan apa yang Anda inginkan jika $FILE berisi karakter spasi putih atau globbing [?*.

Tautan menunjuk ke halaman hebat Wiki Grey Cat tentang mengutip tetapi halaman itu tidak menyebutkan mengutip penggantian perintah secara khusus. Dan sambil mengutip variabel jelas diperlukan, mengutip substitusi perintah itu sendiri tampaknya tidak diperlukan.

Namun, posting yang sama diakhiri dengan:

DIRNAME="$(dirname "$FILE")" adalah cara yang disarankan. Anda dapat mengganti DIRNAME=dengan perintah dan spasi tanpa mengubah apa pun, dan dirname menerima string yang benar.

Itulah yang selalu saya pikirkan juga dan sering membuat posting di sini yang tidak mengutipnya. Namun, halaman wiki yang tertaut di atas juga mengklaim bahwa:

Ada beberapa kasus di mana tanda kutip ganda dapat dihilangkan dengan aman:

Di sisi kanan tugas sederhana. Anda dapat menulis foo=$bar tanpa tanda kutip. Ini sesuai dengan POSIX.

[. . . ]

Sementara var=$(command) bukanlah tugas yang “sederhana”, namun saya tidak dapat menemukan kasus di mana tanda kutip benar-benar diperlukan:

$ var=$(echo "foo bar baz")  ## whitespace works
$  echo "$var"
foo bar baz

$ var=$(printf "foonbar * baz") ## so do globbing characters
$ echo "$var"
foo
bar * baz

$ var1="foonbar * baz"
$ var=$(printf "$var1")  ## printing a variable doesn't make any difference
$ echo "$var" 
foo
bar * baz

$ var=$(printf '%sn' "$var1")
$ echo "$var"
foonbar * baz

$ var=$(printf -- '-e %sn' "$var1") ## strings starting with - also work
$ echo "$var"
-e foonbar * baz

Tentu saja, tanda kutip mutlak diperlukan jika substitusi perintah digunakan secara langsung untuk hal-hal seperti command1 "$(command2)" , tapi sepertinya tidak demikian saat menetapkan variabel.

Jadi, apa yang saya lewatkan? Apakah kutipan pernah dibutuhkan? Kasus sudut apa yang akan mengutip substitusi perintah saat menetapkan nilai pengembaliannya ke variabel melindungimu dari? Atau apakah selalu boleh untuk tidak mengutip substitusi perintah jika itu adalah sisi kanan dari operasi penetapan variabel?

Jawaban yang Diterima:

Sebagai satu referensi, manual Bash jelas tentang ini:

Sebuah variabel dapat ditugaskan oleh sebuah pernyataan dalam bentuk

name=[value]

Jika nilai tidak diberikan, variabel diberi string nol. Semua nilai mengalami ekspansi tilde, ekspansi parameter dan variabel, substitusi perintah, ekspansi aritmatika, dan penghapusan kutipan (rinci di bawah). […] Pemisahan kata tidak dilakukan , dengan pengecualian “[dilindungi email]” seperti yang dijelaskan di bawah. Perluasan nama file tidak dilakukan.

Tidak ada pemisahan kata, tidak ada perluasan nama file, oleh karena itu tidak perlu tanda kutip.

Terkait:Alat baris perintah psql PostgreSQL dan SET CONSTRAINTS DEFERRED?

Adapun POSIX, bagian 2.9.1 Perintah Sederhana:

2. Kata-kata yang bukan merupakan tugas variabel atau pengalihan harus diperluas. Jika ada bidang yang tetap mengikuti perluasannya Jika ada bidang yang tetap mengikuti perluasannya, bidang pertama akan dianggap sebagai nama perintah dan bidang yang tersisa adalah argumen untuk perintah tersebut.
[…]
4. Setiap penugasan variabel harus diperluas untuk perluasan tilde, perluasan parameter, substitusi perintah, perluasan aritmatika, dan penghapusan kutipan sebelum menetapkan nilai.

Saya tidak yakin apakah itu seharusnya ditafsirkan bahwa pemisahan bidang hanya terjadi untuk ekspansi yang dilakukan pada langkah 2? Langkah 4 tidak menyebutkan pemisahan bidang, meskipun bagian Pemisahan bidang juga tidak menyebutkan penetapan variabel sebagai pengecualian untuk menghasilkan beberapa bidang.


Linux
  1. Contoh Perintah Waktu Linux

  2. Contoh Perintah tee di Linux

  3. Melihat output penuh dari perintah PS

  1. perintah openssl hang

  2. Nomor perangkat dalam keluaran perintah stat

  3. Mengarahkan output perintah ke variabel di bash gagal

  1. Bagaimana Cara Menetapkan Output Perintah Ke Variabel Shell?

  2. Ubah output menjadi string

  3. Redirect output dari perintah waktu di unix ke dalam variabel di bash?