Untuk melengkapi jawaban yang ada dan bermanfaat; ujung topi untuk Dukungan QZ karena mendorong saya untuk mengirim jawaban terpisah:
Dua mekanisme berbeda berperan di sini:
(A) apakah cut
itu sendiri memerlukan pembatas (ruang, dalam hal ini) diteruskan ke -d
opsi untuk menjadi argumen yang terpisah atau apakah dapat diterima untuk menambahkannya langsung ke -d
.
(B) bagaimana shell umumnya mem-parsing argumen sebelum meneruskannya ke perintah yang dipanggil.
(a) dijawab dengan kutipan dari pedoman POSIX untuk utilitas (penekanan milik saya)
Jika SYNOPSIS dari utilitas standar menunjukkan opsi dengan argumen opsi wajib [...] aplikasi yang sesuai harus menggunakan argumen terpisah untuk opsi itu dan argumen opsi-nya . Namun , implementasi yang sesuai juga akan mengizinkan aplikasi untuk menentukan opsi dan opsi-argumen dalam string argumen yang sama tanpa karakter intervensi .
Dengan kata lain: Dalam hal ini, karena -d
opsi-argumen wajib , Anda dapat memilih apakah akan menentukan pembatas sebagai :
- (s) BAIK: argumen terpisah
- (d) OR: sebagai nilai langsung terpasang ke
-d
.
Setelah Anda memilih (d) atau (d), shell -string parsing literal - (b) - yang penting:
Dengan pendekatan (s) , semua bentuk berikut SETARA:
-d ' '
-d " "
-d \<space> # <space> used to represent an actual space for technical reasons
Dengan pendekatan (d) , semua bentuk berikut ini EQUIVALENT:
-d' '
-d" "
"-d "
'-d '
d\<space>
Kesetaraan dijelaskan oleh pemrosesan string-literal shell :
Semua solusi di atas menghasilkan string yang sama persis (di setiap kelompok) saat cut
melihatnya :
(s) : cut
melihat -d
, sebagai argumennya sendiri , diikuti oleh argumen terpisah yang berisi karakter spasi - tanpa tanda kutip atau \
awalan !.
(D) : cut
melihat -d
plus char spasi - tanpa tanda kutip atau \
awalan! - sebagai bagian dari argumen yang sama .
Alasan bentuk-bentuk pada kelompok masing-masing pada akhirnya identik dua kali lipat, berdasarkan pada bagaimana shell mem-parsing string literal :
- Shell memungkinkan literal untuk ditentukan sebagaimana adanya melalui mekanisme yang disebut mengutip , yang dapat mengambil beberapa bentuk :
- string yang dikutip tunggal : konten di dalamnya
'...'
diambil secara harfiah dan membentuk argumen tunggal
- string dikutip ganda : isi di dalamnya
"..."
juga membentuk argumen tunggal , tetapi tunduk pada interpolasi (memperluas referensi variabel seperti $var
, penggantian perintah ( $(...)
atau `...`
), atau ekspansi aritmatika ( $(( ... ))
).
\
-kutipan karakter individu : a \
mendahului karakter tunggal menyebabkan karakter yang akan ditafsirkan sebagai literal.
- Mengutip dilengkapi dengan penghapusan kutipan , yang berarti bahwa begitu shell telah mem-parsing baris perintah, itu menghilangkan karakter kutipan dari argumen (melampirkan
'...'
atau "..."
atau \
contoh) - dengan demikian, perintah yang dipanggil tidak pernah melihat karakter kutipan .