คุณสามารถบันทึกและกำหนดให้กับ IFS ได้ตามต้องการ ไม่มีอะไรผิดปกติกับการทำเช่นนั้น ไม่ใช่เรื่องแปลกที่จะบันทึกค่าสำหรับการกู้คืนหลังจากการปรับเปลี่ยนชั่วคราวที่รวดเร็วเช่นตัวอย่างการมอบหมายอาร์เรย์ของคุณ
ในฐานะที่เป็น @llua กล่าวถึงในความคิดเห็นของเขากับคำถามของคุณเพียงแค่ยกเลิกการตั้งค่า IFS จะคืนค่าพฤติกรรมเริ่มต้นเทียบเท่ากับการกำหนดพื้นที่แท็บ - ขึ้นบรรทัดใหม่
ควรพิจารณาว่าจะเป็นปัญหาได้อย่างไรหากไม่กำหนด / ยกเลิกการตั้งค่า IFS อย่างชัดเจนมากกว่าที่จะทำ
จาก POSIX 2013 edition, ตัวแปรเชลล์ 2.5.3 :
การนำไปใช้อาจละเว้นค่าของ IFS ในสภาพแวดล้อมหรือไม่มี IFS จากสภาพแวดล้อม ณ เวลาที่เชลล์ถูกเรียกใช้ในกรณีนี้เชลล์จะตั้งค่า IFS เป็น <space> <tab> <newline> เมื่อมีการเรียกใช้ .
เชลล์ที่ถูกเรียก POSIX ซึ่งเป็นไปตาม POSIX อาจมีหรือไม่มีสืบทอด IFS จากสภาพแวดล้อมของมัน จากนี้ต่อไปนี้:
- สคริปต์แบบพกพาไม่สามารถพึ่งพา IFS ที่สืบทอดผ่านทางสภาพแวดล้อมได้
- สคริปต์ที่ตั้งใจจะใช้เฉพาะพฤติกรรมการแยกเริ่มต้น (หรือการเข้าร่วมในกรณีของ
"$*"
) แต่อาจทำงานภายใต้เชลล์ที่เริ่มต้น IFS จากสภาพแวดล้อมต้องตั้งค่า / ยกเลิกการตั้งค่า IFS อย่างชัดเจนเพื่อป้องกันตัวเองจากการบุกรุกทางสิ่งแวดล้อม
NB เป็นสิ่งสำคัญที่ต้องเข้าใจว่าสำหรับการสนทนานี้คำว่า "เรียกใช้" มีความหมายเฉพาะ เชลล์จะถูกเรียกใช้เฉพาะเมื่อมันถูกเรียกอย่างชัดเจนโดยใช้ชื่อของมัน (รวมถึง#!/path/to/shell
shebang) เชลล์ย่อย - เช่นอาจถูกสร้างขึ้นโดย$(...)
หรือcmd1 || cmd2 &
- ไม่ใช่เชลล์ที่ถูกเรียกใช้และ IFS (พร้อมกับสภาพแวดล้อมการประมวลผลส่วนใหญ่) นั้นเหมือนกับของพาเรนต์ เชลล์ที่เรียกใช้ตั้งค่าของ$
pid ในขณะที่ subshells สืบทอด
นี่ไม่ได้เป็นเพียงแค่การแสดงออกทางความคิดเท่านั้น มีความแตกต่างที่เกิดขึ้นจริงในพื้นที่นี้ นี่คือสคริปต์สั้น ๆ ที่ทดสอบสถานการณ์โดยใช้เชลล์ที่แตกต่างกันหลายตัว มันส่งออก IFS ที่แก้ไขแล้ว (ตั้งค่าเป็น:
) ไปยังเชลล์ที่เรียกใช้จากนั้นพิมพ์ IFS เริ่มต้นของมัน
$ cat export-IFS.sh
export IFS=:
for sh in bash ksh93 mksh dash busybox:sh; do
printf '\n%s\n' "$sh"
$sh -c 'printf %s "$IFS"' | hexdump -C
done
โดยทั่วไปแล้ว IFS ไม่ได้ถูกทำเครื่องหมายเพื่อการส่งออก แต่ถ้าเป็นเช่นนั้นให้สังเกตว่า bash, ksh93 และ mksh เพิกเฉยต่อสภาพแวดล้อมของพวกเขาIFS=:
อย่างไรในขณะที่ขีดกลางและ busybox ให้เกียรติมัน
$ sh export-IFS.sh
bash
00000000 20 09 0a | ..|
00000003
ksh93
00000000 20 09 0a | ..|
00000003
mksh
00000000 20 09 0a | ..|
00000003
dash
00000000 3a |:|
00000001
busybox:sh
00000000 3a |:|
00000001
ข้อมูลรุ่นบางอย่าง:
bash: GNU bash, version 4.3.11(1)-release
ksh93: sh (AT&T Research) 93u+ 2012-08-01
mksh: KSH_VERSION='@(#)MIRBSD KSH R46 2013/05/02'
dash: 0.5.7
busybox: BusyBox v1.21.1
แม้ว่า bash, ksh93 และ mksh จะไม่เริ่มต้น IFS จากสภาพแวดล้อม แต่จะส่งออก IFS ที่แก้ไขใหม่
หากด้วยเหตุผลใดก็ตามที่คุณต้องพกพา IFS ผ่านทางสภาพแวดล้อมคุณไม่สามารถทำได้ด้วยการใช้ IFS เอง คุณจะต้องกำหนดค่าให้กับตัวแปรอื่นและทำเครื่องหมายตัวแปรนั้นเพื่อส่งออก เด็ก ๆ จะต้องกำหนดค่าดังกล่าวให้กับ IFS ของพวกเขาอย่างชัดเจน