ฉันรู้ว่า!
มีความสำคัญเป็นพิเศษใน commandline ในบริบทของประวัติศาสตร์ commandline แต่นอกเหนือจากนั้นในสคริปต์การเรียกใช้เครื่องหมายอัศเจรีย์ในบางครั้งอาจทำให้เกิดข้อผิดพลาดในการแยกวิเคราะห์
ฉันคิดว่ามันมีบางอย่างเกี่ยวข้องกับการevent
แต่ฉันไม่ทราบว่าเหตุการณ์คืออะไรหรือทำอะไร ถึงกระนั้นคำสั่งเดียวกันก็สามารถทำงานต่างกันในสถานการณ์ที่ต่างกัน
ตัวอย่างสุดท้ายด้านล่างทำให้เกิดข้อผิดพลาด แต่ทำไมเมื่อรหัสเดียวกันทำงานนอกการทดแทนคำสั่ง? .. ใช้ GNU bash 4.1.5
# This works, with or without a space between ! and p
{ echo -e "foo\nbar" | sed -nre '/foo/! p'
echo -e "foo\nbar" | sed -nre '/foo/!p'; }
# bar
# bar
# This works, works when there is a space between ! and p
var="$(echo -e "foo\nbar" | sed -nre '/foo/! p')"; echo "$var"
# bar
# This causes an ERROR, with NO space between ! and p
var="$(echo -e "foo\nbar" | sed -nre '/foo/!p')"; echo "$var"
# bash: !p': event not found
protected
จะเหมาะสมกว่า (ได้รับการคุ้มครองโดย 'คำพูดเดียว')
var=$(…)
(ไม่มีเครื่องหมายคำพูดคู่) และมันจะทำงานเหมือน (ฉันคิดว่า) ที่คุณคาดหวัง นี้ยังคงเป็น“ปลอดภัย” เพราะส่วนมูลค่าของการกำหนดง่ายๆคือไม่ใช่เรื่องที่จะแยกคำหรือ globbing (แม้ว่านี้อาจไม่เป็นจริงของการมอบหมายงานทำผ่าน builtins (เช่นexport
, local
ฯลฯ ) ภายใต้เปลือกหอยทั้งหมด) น่าเสียดายที่สิ่งนี้ไม่ได้ขยายออกไปนอกเหนือจากการมอบหมายอย่างง่าย ๆ เนื่องจากการเสนอราคาซ้ำเป็นวิธีการป้องกันการแยกคำและการโค้งขณะที่ยังคงได้รับการขยายประเภทอื่น ๆ ในบริบทอื่น ๆ