IFS null ไม่เหมือนกับ IFS unset หรือไม่


13

ผมอ่านคำถามที่ดีที่นี่เรียกว่าเข้าใจไอเอฟเอ ฉันรู้สึกประหลาดใจเพราะคำตอบและความคิดเห็นอ้างถึง POSIX ซึ่งระบุว่า IFS = ไม่เหมือนกับการยกเลิกการตั้งค่า IFS หากคุณยกเลิกการตั้งค่า IFS จะเห็นได้ว่ามีการใช้ค่าเริ่มต้น ถ้าคุณทำให้ IFS เป็นโมฆะแทนจะไม่มีตัวแยก ฉันรู้ว่าฉันเคยเห็นสิ่งที่แตกต่างและฉันพบสิ่งนี้ในบุ๊คมาร์คของฉัน:

การเขียนโปรแกรม Bourne Shell

$ ไอเอฟเอ

ข้อความแรกสุดในสคริปต์ของคุณควรเป็น

ไอเอฟเอ =

ซึ่งรีเซ็ตตัวคั่นฟิลด์อินพุตเป็นค่าดีฟอลต์ มิฉะนั้นคุณจะสืบทอด $ IFS จากผู้ใช้ซึ่งอาจจะตั้งค่าเป็นค่าที่แปลกประหลาดบางอย่างเพื่อสร้างสตริงการแยกวิเคราะห์ที่แตกต่างจากที่คุณคาดไว้และทำให้เกิดพฤติกรรมแปลก ๆ

เป็นเช่นนั้นจริงเมื่อไม่นานมานี้หรือผู้แต่งผิดพลาด

คำตอบ:


20

คำตอบที่คุณพบในการแลกเปลี่ยนสแต็คนั้นถูกต้องและบทช่วยสอนนี้ไม่ถูกต้อง คุณสามารถทดลองด้วยตัวเองหรือมองมันได้ในมาตรฐาน unset IFSเทียบเท่ากับการตั้งค่าเป็นค่าเริ่มต้นของ space-tab-newline ในขณะที่ว่างเปล่าIFSปิดการแยกฟิลด์อย่างมีประสิทธิภาพ

คุณสามารถดูหน้าของ Sven Mascheck บน IFSเกี่ยวกับการใช้งานในอดีต กระสุนประวัติศาสตร์สองสามตัวไม่ชอบunset IFSและ ksh รุ่นเก่ามากถือว่ามันว่างเปล่าIFSแต่กระสุนสมัยใหม่ทั้งหมดและกระสุนเก่าส่วนใหญ่ถือว่าไม่มีการตั้งค่าIFSเหมือนค่าเริ่มต้น

คุณไม่ควรเริ่มต้นสคริปต์ด้วยIFS=เว้นแต่คุณต้องการปิดการแบ่งฟิลด์ (ซึ่งอาจเป็นการตัดสินใจที่สมเหตุสมผล - แต่โปรดทราบว่าคุณยังต้องใส่เครื่องหมายอัญประกาศล้อมรอบการแทนที่เพื่อหลีกเลี่ยงการวนซ้ำนอกจากว่าคุณจะปิดด้วยset -f) unset IFSการรีเซ็ตค่าเริ่มต้นใช้งาน เป็นที่ถกเถียงกันว่าสิ่งนี้มีประโยชน์เมื่อเริ่มต้นสคริปต์หรือไม่ มีสิ่งเลวร้ายอื่น ๆ อีกมากมายเช่นการหลบPATHซึ่งผู้โทรสามารถทำได้เพื่อทำให้สคริปต์ของคุณผิดพลาด

PATHกวดวิชานี้ยังให้คำแนะนำในการรีเซ็ต นี่เป็นคำแนะนำที่ไม่ดี ในกรณีส่วนใหญ่คุณไม่สามารถคาดเดาเส้นทางการค้นหาที่ถูกต้องได้ แต่ผู้ใช้รู้ คุณจะรู้ว่าไม่ว่าจะเป็น/usr/local/binหรือ/home/bob/binมีข้อผิดพลาดรุ่นคงที่ของสาธารณูปโภคบนยูนิกซ์โบราณที่คนใน/usr/binมีรถ? คุณต้องการฝังตรรกะทั้งหมดเพื่อคิดออกว่าจะนำ/usr/xpg6/binหน้า/bin? คุณต้องการตำแหน่ง/usr/gnu/binอะไร อย่ารีเซ็ต PATH ยกเว้นว่าสคริปต์ของคุณกำหนดเป้าหมายระบบเฉพาะ

ฉันไม่ได้อ่านบทช่วยสอนนี้ แต่ฉันได้ตรวจสอบสิ่งหนึ่ง: มันไม่ได้บอกคุณตั้งแต่เริ่มต้นที่จะใส่เครื่องหมายคำพูดคู่รอบการแทนที่ตัวแปรและการแทนที่คำสั่งเสมอ ดังนั้นฉันไม่คิดว่าการสอนนี้เป็นสิ่งที่ดี


unset IFSไม่รีเซ็ต IFS เป็นค่าเริ่มต้นใน bash แม้ว่าจะรีเซ็ตการแยกฟิลด์
Melab

@Melab unset IFSไม่ได้รีเซ็ตIFSเป็นค่าเริ่มต้นแต่จะยกเลิกการตั้งค่า แต่การ unset IFSมีผลเช่นเดียวกับที่IFSตั้งเป็นค่าเริ่มต้น
Gilles 'หยุดความชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.