ฉันสงสัยว่านี่เป็นส่วนหนึ่งของลำดับที่ดึงดูดคุณ:
คำที่ไม่ใช่การกำหนดตัวแปรหรือการเปลี่ยนเส้นทางจะถูกขยาย (ดูการขยายเชลล์) หากคำใด ๆ ยังคงอยู่หลังจากการขยายคำแรกจะถูกนำมาเป็นชื่อของคำสั่งและคำที่เหลือเป็นอาร์กิวเมนต์
มาจากคู่มืออ้างอิง Bashในส่วนของ Simple Command Expansion
ในตัวอย่างเช่นไม่มีตัวแปรสภาพแวดล้อมที่มีการตั้งค่าและทุบตีกระบวนการบรรทัดคำสั่งผ่านการขยายตัวพารามิเตอร์ออกcmd=bash
bash -c "echo hi"
ในตัวอย่างเช่นมีการมอบหมายงานอีกครั้งไม่มีตัวแปรในครั้งแรกผ่านเพื่อให้การประมวลผลยังคงขยายตัวพารามิเตอร์ผลในคำแรกของprefix=hello=hi
hello=hi
เมื่อการกำหนดตัวแปรได้รับการประมวลผลแล้วพวกเขาจะไม่ถูกประมวลผลอีกครั้งในระหว่างการดำเนินการคำสั่ง
ดูการประมวลผลและผลลัพธ์ของมันภายใต้set -x
:
$ prefix=hello=hi
+ prefix=hello=hi
$ $prefix bash -c 'echo $hello'
+ hello=hi bash -c 'echo $hello'
-bash: hello=hi: command not found
$ hello=42 bash -c 'echo $hello'
+ hello=42
+ bash -c 'echo $hello'
42
สำหรับรูปแบบที่ปลอดภัยยิ่งขึ้นของ "ตัวแปรส่วนขยาย" - เป็น - "ตัวแปรสภาพแวดล้อม" มากกว่าeval
ให้พิจารณาข้อเสนอแนะของ wjandrea ของenv
:
prefix=hello=hi
env "$prefix" bash -c 'echo "$hello"'
hi
มันไม่ได้เป็นการกำหนดตัวแปรบรรทัดคำสั่งอย่างเคร่งครัดเนื่องจากเราใช้env
ฟังก์ชันหลักของยูทิลิตี้ในการกำหนดตัวแปรสภาพแวดล้อมให้กับคำสั่ง แต่มันก็บรรลุเป้าหมายเดียวกัน $prefix
ตัวแปรจะขยายตัวระหว่างการประมวลผลของบรรทัดคำสั่งให้ชื่อ = มูลค่าให้กับผู้ที่ผ่านมันไปให้env
bash
env
แทนeval
ซึ่ง IIRC นั้นปลอดภัยกว่า แต่ช้ากว่า