TL; DR: ในกรณีของexport FOO=barทุบตีเรียกการสร้างสภาพแวดล้อมชั่วคราวชุดในสภาพแวดล้อมที่แล้วมีผลเป็นคำสั่งสุดท้ายของFOO=bar export FOOณ จุดนั้นFOOถือเป็นอาร์กิวเมนต์สุดท้าย
อ่าผู้ที่ถูกทารุณกรรมมาก$_:
($ _, ขีดล่าง) เมื่อเริ่มต้นเชลล์ตั้งค่าชื่อพา ธ สัมบูรณ์ที่ใช้เพื่อเรียกใช้เชลล์หรือเชลล์สคริปต์ที่จะดำเนินการตามที่ส่งผ่านในสภาพแวดล้อมหรือรายการอาร์กิวเมนต์ ต่อจากนั้นขยายไปยังอาร์กิวเมนต์สุดท้ายไปยังคำสั่งก่อนหน้าหลังจากการขยาย นอกจากนี้ยังตั้งเป็นชื่อพา ธ แบบเต็มที่ใช้เพื่อเรียกใช้คำสั่งแต่ละคำสั่งที่เรียกใช้และวางไว้ในสภาพแวดล้อมที่ส่งออกไปยังคำสั่ง เมื่อตรวจสอบเมลพารามิเตอร์นี้เก็บชื่อของไฟล์เมล
ลองดูความหลากหลายของรูปแบบ:
$ man; echo $_
What manual page do you want?
man
$ man foo; echo $_
No manual entry for foo
foo
$ echo; echo $_
echo
$ echo bar foo; echo $_
bar foo
foo
$ foo=x eval 'echo $foo'; echo $_
x
echo $foo
$ bar() { man $1; }; echo $_
foo
$ for (( i=0; $i<0; i=i+1 )); do echo $i; done; echo $_
foo
$ bar; echo $_
What manual page do you want?
man
$ bar foo; echo $_
No manual entry for foo
foo
$ MANPATH=/tmp; echo $_
$ export MANPATH=/tmp; echo $_
MANPATH
ดังนั้นเราเห็นสามรูปแบบที่นี่:
- คำสั่งที่เรียกใช้จากระบบไฟล์ฟังก์ชั่นและบิวด์อินทำงานตามที่คาดไว้:
$_ตั้งค่าเป็นชื่อคำสั่งเองหากไม่มีข้อโต้แย้งมิฉะนั้นเป็นอาร์กิวเมนต์สุดท้ายที่นำเสนอ
- หลังจากนิยามฟังก์ชัน, ลูปและการสร้างโลจิคัลอื่น ๆ :
$_จะไม่ถูกแก้ไข
- ทุกอย่างอื่น:
$_ถูกตั้งค่าเป็นสิ่งที่ไม่คาดคิด แปลก.
ฉันใช้รหัสเพื่อให้ข้อมูลเชิงลึกเกี่ยวกับความแปลกประหลาด
$ ./bash --noprofile --norc -c 'man foo'
lastword=[man]
lastarg=[foo]
$ ./bash --noprofile --norc -c 'export FOO=bar'
lastword=[export]
lastarg=[FOO=bar]
bind_variable, name=[FOO], value=[bar]
before bind_lastarg, lastarg=[FOO]
bind_lastarg, arg=[FOO]
bind_variable, name=[_], value=[FOO]
$ ./bash --noprofile --norc -c 'declare FOO=bar'
lastword=[declare]
lastarg=[FOO=bar]
bind_variable, name=[FOO], value=[(null)]
before bind_lastarg, lastarg=[FOO=bar]
bind_lastarg, arg=[FOO=bar]
bind_variable, name=[_], value=[FOO=bar]
คุณสามารถเห็นได้ว่าตัวแยกวิเคราะห์เห็นอาร์กิวเมนต์สุดท้ายที่คาดไว้ ( lastarg=) ในทุกกรณี แต่สิ่งที่เกิดขึ้นหลังจากนั้นขึ้นอยู่กับสิ่งที่ทุบตีคิดว่าควรจะเกิดขึ้น ดูexecute_cmd.c, execute_simple_command ()
ในกรณีของexport FOO=barทุบตีทำการกำหนดแล้วส่งออกตัวแปร ดูเหมือนว่าสอดคล้องกับการยืนยันของเอกสารประกอบที่อาร์กิวเมนต์สุดท้ายคำนวณหลังจากการขยาย
EDITORเป็นข้อโต้แย้งในการส่งออก