ในบางเชลล์ (รวมถึงbash
):
IFS=: command eval 'p=($PATH)'
(ด้วยbash
, คุณสามารถละเว้นcommand
ถ้าไม่อยู่ในการจำลอง sh / POSIX) แต่ระวังว่าเมื่อใช้ตัวแปรที่ไม่ได้กล่าวถึงคุณจำเป็นต้องใช้โดยทั่วไปset -f
และไม่มีขอบเขตภายในสำหรับเชลล์ส่วนใหญ่
ด้วย zsh คุณสามารถทำได้:
(){ local IFS=:; p=($=PATH); }
$=PATH
คือการบังคับให้แยกคำที่ไม่ได้ทำไว้เป็นค่าเริ่มต้นในzsh
(การวนตามการขยายตัวของตัวแปรไม่ได้ทำเช่นนั้นดังนั้นคุณไม่ต้องการset -f
ยกเว้นในการจำลอง sh)
(){...}
(หรือfunction {...}
) เรียกว่าฟังก์ชั่นที่ไม่ระบุชื่อและโดยทั่วไปจะใช้ในการตั้งค่าขอบเขตท้องถิ่น ด้วยเชลล์อื่น ๆ ที่สนับสนุนขอบเขตโลคัลในฟังก์ชันคุณสามารถทำสิ่งที่คล้ายกับ:
e() { eval "$@"; }
e 'local IFS=:; p=($PATH)'
ที่จะใช้ขอบเขตท้องถิ่นสำหรับตัวแปรและตัวเลือกในเปลือกหอย POSIX คุณยังสามารถใช้ฟังก์ชั่นที่มีให้ ณhttps://github.com/stephane-chazelas/misc-scripts/blob/master/locvar.sh จากนั้นคุณสามารถใช้มันเป็น:
. /path/to/locvar.sh
var=3,2,2
call eval 'locvar IFS; locopt -f; IFS=,; set -- $var; a=$1 b=$2 c=$3'
(โดยวิธีการที่ไม่สามารถแยก$PATH
วิธีดังกล่าวข้างต้นยกเว้นในzsh
เช่นเดียวกับเชลล์อื่น ๆ IFS เป็นตัวคั่นฟิลด์ไม่ใช่ตัวคั่นฟิลด์)
IFS=$'\n' a=($str)
เป็นเพียงการมอบหมายสองอย่างและอีกอันหนึ่งเหมือนa=1 b=2
กัน
หมายเหตุของคำอธิบายเกี่ยวกับvar=value cmd
:
ใน:
var=value cmd arg
รันเปลือก/path/to/cmd
ในกระบวนการใหม่และบัตรcmd
และarg
ในargv[]
และในvar=value
envp[]
นั่นไม่ใช่การกำหนดตัวแปร แต่เป็นการส่งผ่านตัวแปรสภาพแวดล้อมไปยังคำสั่งที่ดำเนินการ ในเชลล์ Bourne หรือ Korn ด้วยset -k
คุณยังสามารถเขียนมันcmd var=value arg
ได้
ตอนนี้ที่ใช้ไม่ได้กับ builtins หรือฟังก์ชั่นที่ไม่ได้ดำเนินการ ใน Bourne shell, in var=value some-builtin
, var
จบลงด้วยการตั้งค่าในภายหลังเช่นvar=value
เดียวกับคนเดียว นั่นหมายถึงตัวอย่างที่พฤติกรรมของvar=value echo foo
(ซึ่งไม่มีประโยชน์) แตกต่างกันไปขึ้นอยู่กับว่าecho
มีการสร้างขึ้นหรือไม่
POSIX และ / หรือksh
การเปลี่ยนแปลงที่ในการที่ว่าพฤติกรรมของบอร์นจะเกิดขึ้นสำหรับหมวดหมู่ของ builtins ที่เรียกว่าbuiltins พิเศษ eval
เป็น builtin พิเศษread
ไม่ได้ สำหรับ builtin ที่ไม่ใช่แบบพิเศษให้var=value builtin
ตั้งค่าvar
เฉพาะสำหรับการเรียกใช้งานของ builtin ซึ่งทำให้มันทำงานคล้ายกับเมื่อมีการเรียกใช้คำสั่งภายนอก
command
คำสั่งที่สามารถใช้ในการลบพิเศษแอตทริบิวต์ของผู้ที่builtins พิเศษ สิ่งที่ POSIX มองข้ามคือสำหรับeval
และ.
บิวด์อินนั่นหมายความว่าเชลล์จะต้องใช้ตัวแปรสแต็ก (แม้ว่าจะไม่ได้ระบุlocal
หรือtypeset
คำสั่งการ จำกัด ขอบเขต) เนื่องจากคุณสามารถทำได้:
a=0; a=1 command eval 'a=2 command eval echo \$a; echo $a'; echo $a
หรือแม้กระทั่ง:
a=1 command eval myfunction
ด้วยmyfunction
การเป็นฟังก์ชั่นการใช้หรือการตั้งค่าและอาจเรียก$a
command eval
นั่นเป็นสิ่งที่มองข้ามเพราะksh
(ซึ่งข้อมูลจำเพาะส่วนใหญ่อ้างอิงจาก) ไม่ได้ใช้มัน (และ AT&T ksh
และzsh
ยังไม่ทำ) แต่ทุกวันนี้ยกเว้นทั้งสองเชลล์ส่วนใหญ่ใช้มัน พฤติกรรมแตกต่างกันระหว่างหอยในสิ่งที่ชอบ:
a=0; a=1 command eval a=2; echo "$a"
แม้ การใช้local
บนเชลล์ที่สนับสนุนเป็นวิธีที่เชื่อถือได้มากขึ้นในการใช้ขอบเขตโลคัล
IFS=: command eval …
กำหนดIFS
เฉพาะในช่วงเวลาของeval
ตามที่ได้รับคำสั่งจาก POSIX ในประ, pdksh และทุบตี แต่ไม่ได้อยู่ใน ksh 93u มันผิดปกติที่จะเห็นว่า ksh นั้นเป็นสิ่งที่แปลกและไม่เข้ากันเลย