ตัวแปรเชลล์ $ _ ไม่ทำงานตามที่คาดไว้


11

เหตุผลที่จำนวนบรรทัดแตกต่างกันอย่างไร

$ head -n 100000 ./access.log > ./data/log.sample
$ cat $_ | wc -l
1933424

1
นอกจากนี้โปรดเยี่ยมชมพารามิเตอร์พิเศษสำหรับ bash
Pandya

1
ในบริบทแบบโต้ตอบ!$ทำสิ่งที่คุณต้องการ แต่จะไม่ทำงานในสคริปต์ IIRC
zwol

@zwol: ใช่ ฉันถามคำถามเกี่ยวกับมัน
Loom

คุณควรใช้teeคำสั่งในสคริปต์ของคุณ
Diti

คำตอบ:


26

$_จะขยายไปยัง./access.log(อาร์กิวเมนต์สุดท้ายของคำสั่งดำเนินการที่ผ่านมา) ./data/log.sampleไม่ได้

./access.logดังนั้นคุณจะเห็นจริงจำนวนเส้นของ

การเปลี่ยนเส้นทาง ( >) ไม่ได้เป็นส่วนหนึ่งของheadคำสั่งเนื่องจากเชลล์ทำก่อนที่headคำสั่งจะเริ่มทำงาน ดังนั้นด้วยคุณจะได้รับ$_./access.log


จากman bash:

($ _, ขีดล่าง) เมื่อเริ่มต้นเชลล์ตั้งค่าชื่อพา ธ สัมบูรณ์ที่ใช้เพื่อเรียกใช้เชลล์หรือเชลล์สคริปต์ที่จะดำเนินการตามที่ส่งผ่านในสภาพแวดล้อมหรือรายการอาร์กิวเมนต์ ต่อจากนั้นขยายไปยังอาร์กิวเมนต์สุดท้ายไปยังคำสั่งก่อนหน้าหลังจากการขยาย นอกจากนี้ยังตั้งเป็นชื่อพา ธ แบบเต็มที่ใช้เพื่อเรียกใช้คำสั่งแต่ละคำสั่งที่ดำเนินการและวางไว้ในสภาพแวดล้อมที่ส่งออกไปยังคำสั่งนั้น เมื่อตรวจสอบเมลพารามิเตอร์นี้เก็บชื่อของไฟล์เมล


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