IFS null tidak sama dengan IFS yang tidak disetel?

13

Saya membaca pertanyaan besar di sini yang disebut Memahami IFS . Saya terkejut karena jawaban dan komentarnya mengutip POSIX yang menyatakan bahwa IFS = tidak sama dengan unsetting IFS. Jika Anda menghapus IFS, ternyata nilai default digunakan. Jika Anda membuat IFS null sebagai gantinya, tidak ada splitter. Saya tahu saya telah melihat sudut pandang yang berbeda, dan saya menemukan ini di bookmark saya:

Pemrograman Bourne Shell

$ IFS

Pernyataan pertama dalam skrip Anda seharusnya

IFS =

yang mengatur ulang pemisah bidang input ke nilai standarnya. Jika tidak, Anda mewarisi $ IFS dari pengguna, yang mungkin telah menetapkannya ke beberapa nilai aneh untuk membuat string parsing sh berbeda dari cara yang Anda harapkan, dan memicu perilaku aneh.

Jadi, apakah itu benar beberapa waktu lalu atau apakah penulisnya salah?

uji
sumber

Jawaban:

20

Jawaban yang Anda temukan di Stack Exchange benar dan tutorial ini salah. Anda dapat bereksperimen sendiri atau mencarinya di standar . Set IFStidak sama dengan mengaturnya ke nilai default space-tab-newline, sementara yang kosong IFSsecara efektif mematikan pemisahan bidang.

Anda dapat membaca halaman Sven Mascheck tentang IFS tentang implementasi historis. Beberapa cangkang historis tidak suka unset IFS, dan versi ksh yang sangat lama memperlakukannya seperti IFScangkang kosong tetapi semua cangkang modern dan kebanyakan cangkang lama memperlakukan yang belum disetel IFSseperti nilai default.

Anda tidak boleh memulai skrip IFS=Anda kecuali jika Anda ingin mematikan pemisahan bidang (yang bisa menjadi keputusan yang masuk akal - tetapi perhatikan bahwa Anda masih perlu menempatkan tanda kutip ganda di sekitar pengganti untuk menghindari globbing, kecuali jika Anda mematikannya set -fjuga). Untuk mengatur ulang nilai default, gunakan unset IFS. Masih bisa diperdebatkan apakah ini berguna di awal skrip; ada banyak hal buruk lainnya seperti cerdik PATHyang dapat dilakukan penelepon untuk membuat skrip Anda salah.

Tutorial ini juga menyarankan untuk mengatur ulang PATH. Ini biasanya saran yang buruk. Dalam kebanyakan kasus, Anda tidak dapat memprediksi apa jalur pencarian yang benar, tetapi pengguna tahu. Bagaimana Anda tahu apakah ada /usr/local/binatau /home/bob/binmengandung versi utilitas yang diperbaiki bug pada unix kuno di mana yang ada di dalamnya /usr/binbermasalah? Apakah Anda benar-benar ingin menanamkan semua logika untuk mencari tahu apakah akan menempatkan /usr/xpg6/bindepan /bin? Pada posisi apa yang Anda inginkan /usr/gnu/bin? Jangan mengatur ulang PATH kecuali skrip Anda menargetkan sistem tertentu.

Saya belum membaca tutorial ini, tetapi saya memang memeriksa satu hal: itu tidak memberitahu Anda sejak awal untuk selalu menempatkan tanda kutip ganda di sekitar substitusi variabel dan substitusi perintah. Jadi saya tidak berpikir tutorial ini bagus.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
unset IFStidak mereset IFS ke nilai defaultnya di bash meskipun itu mengatur ulang pemisahan bidang.
Melab
@Melab unset IFStidak diatur ulang IFSke nilai defaultnya, ini tidak menguretnya. Tetapi unset IFSmemiliki efek yang sama seperti yang IFSdiatur ke nilai default.
Gilles 'SO- stop being evil'