Saya semakin bingung tentang peran kata splitting zsh
. Saya belum terkena konsep ini ketika pemrograman dalam C, Python atau MATLAB, dan ini telah memicu minat saya mengapa pemisahan kata tampaknya menjadi sesuatu yang spesifik untuk pemrograman shell.
Saya telah membaca tentang pemisahan kata pada situs ini dan situs lain sebelumnya, tetapi belum menemukan penjelasan yang jelas tentang konsep ini. Wikipedia memiliki definisi pemisahan kata tetapi tampaknya tidak memiliki referensi tentang bagaimana ia berlaku untuk shell Unix.
Berikut ini contoh kebingungan saya di zsh
:
Dalam Z Shell FAQ , saya membaca yang berikut:
3.1: Mengapa di
$var
manavar="foo bar"
tidak melakukan apa yang saya harapkan?Dalam sebagian besar turunan Bourne-shell, variabel multi-kata seperti
var="foo bar"
dipecah menjadi kata-kata saat diteruskan ke perintah atau digunakan dalam satufor foo in $var
lingkaran. Secara default, zsh tidak memiliki perilaku itu: variabel tetap utuh. (Ini bukan bug! Lihat di bawah.) PilihanSH_WORD_SPLIT
ada untuk memberikan kompatibilitas.
Namun, dalam Manual Z Shell , saya membaca yang berikut:
SH_WORD_SPLIT (-y) <K> <S>
Menyebabkan pemisahan bidang dilakukan pada ekspansi parameter yang tidak dikutip. Perhatikan bahwa opsi ini tidak ada hubungannya dengan pemisahan kata. (Lihat Ekspansi Parameter.)
Mengapa mengatakan bahwa SH_WORD_SPLIT
memiliki ada hubungannya dengan kata membelah? Bukankah kata pemecahan tepat tentang apa ini?
"word1 word2 word3"
menjadi daftar / array formulir"word1" "word2" "word3"
? Saya juga telah memperbarui OP dengan sumber kebingungan khusus di zsh.$IFS
karakter. Karenanya "pemisahan lapangan" adalah nama yang lebih baik. Tetapi "pemecahan kata" sering digunakan untuk konsep ini dalam literatur shell. Dokumentasi zsh berdalih tentang kata-kata.rc
(shell plan9, juga porting ke Unix) untuk desain yang lebih baik daripada zsh ketika datang ke variabel dan array.Pemisahan kata tidak benar-benar spesifik untuk shell.
Sebagian besar program yang perlu mengurai input teks menggunakan beberapa bentuk pemisahan kata sebagai langkah pertama. Hal ini dilakukan sebelum mengidentifikasi dari "kata-kata" ini, angka, operator, string, token, dan entitas serupa apa pun yang perlu mereka proses.
Apa yang spesifik dengan shell adalah bahwa mereka harus membangun dengan benar daftar argumen dari perintah yang disebut (C argc / argv, python sys.argv), termasuk meneruskan argumen dengan ruang yang disematkan, argumen kosong, pembatas kustom dan sebagainya. Banyak shell menggunakan variabel IFS untuk memungkinkan fleksibilitas di sana.
sumber
Dalam kasus spesifik Zsh ini, pemisahan kata didefinisikan sedikit berbeda dari pemisahan bidang.
Pertimbangkan
prog a b c
, itu akan melewati tiga argumen tidak peduli bagaimana Anda mengaturIFS
. Ini adalah pemisahan kata .Jika Anda melakukannya
A="a b c"; prog $A
, itu akan melewati tiga argumen jikaIFS
menyertakan spasi atau satu argumen sebaliknya. Ini adalah pemisahan bidang .Definisi di sini halus. Apa yang ingin dikatakan dokumen Zsh adalah bahwa, meskipun Anda menonaktifkan opsi itu,
prog a b c
masih akan mendapatkan argumen terpisah (yang selalu diharapkan orang).sumber