มีสองไวยากรณ์สำหรับการทดแทนคำสั่ง: ด้วยดอลลาร์วงเล็บและ backticks วิ่งtop -p $(pidof init)
และtop -p `pidof init`
ให้ผลลัพธ์เดียวกัน มีสองวิธีในการทำสิ่งเดียวกันหรือมีความแตกต่าง?
มีสองไวยากรณ์สำหรับการทดแทนคำสั่ง: ด้วยดอลลาร์วงเล็บและ backticks วิ่งtop -p $(pidof init)
และtop -p `pidof init`
ให้ผลลัพธ์เดียวกัน มีสองวิธีในการทำสิ่งเดียวกันหรือมีความแตกต่าง?
คำตอบ:
backquotes แบบเก่า` `
ทำ backslashes และซ้อนกันเล็กน้อย รูปแบบใหม่$()
ตีความทุกอย่างในระหว่าง( )
เป็นคำสั่ง
echo $(uname | $(echo cat))
Linux
echo `uname | `echo cat``
bash: command substitution: line 2: syntax error: unexpected end of file
echo cat
ใช้งานได้หาก backquotes ซ้อนอยู่หลบหนี:
echo `uname | \`echo cat\``
Linux
แบ็กสแลชสนุก:
echo $(echo '\\')
\\
echo `echo '\\'`
\
รูปแบบใหม่$()
ใช้กับเชลล์ที่สอดคล้องกับPOSIXทั้งหมด
ในฐานะที่เป็นmouvicielชี้ให้เห็นแบบเก่า` `
อาจจะจำเป็นสำหรับเปลือกหอยเก่า
นอกเหนือจากมุมมองทางเทคนิคแบบเก่า` `
ยังมีข้อเสียทางสายตา:
I like $(program) better than `program`
'`'`''`''`'`''`'
(และ SE ใช้` `
เพื่อจุดประสงค์ของตัวเองมันเป็นความเจ็บปวดที่เขียนคำตอบนี้ :)
{ }
มักจะเรียกว่า "วงเล็บปีกกา" หรือ "วงเล็บ" en.wikipedia.org/wiki/Braces_(punctuation)#Braces
`
เป็นคีย์ที่ตายแล้วดังนั้นฉันต้องพิมพ์ backtick สองครั้ง (สิ่งที่ฉันมักจะลืมว่าฉันทำได้) หรือ backtick space ซึ่งเป็น ความเจ็บปวด
แตกต่างที่ชัดเจนผมสังเกตคือการที่คุณไม่สามารถ backticks $()
รังขณะที่คุณสามารถทำรัง อาจมีอยู่ทั้งคู่ด้วยเหตุผลดั้งเดิม ในทำนองเดียวกันคำสั่ง.
และsource
มีความหมายเหมือนกัน
source
บางหอยบอร์นที่ได้มาไม่รู้จัก ขีดกลางเป็นตัวอย่างหนึ่ง
$(...)
และ`...`
เป็นมาตรฐาน (หลังถูกคัดค้าน) ในขณะที่.
เป็นมาตรฐาน แต่ไม่ใช่source
(t)csh
จะไม่สามารถซ้อนในได้ (t)csh
ไม่สนับสนุน$(...)
แม้ว่า พวกเขาให้การสนับสนุนsource
(ไม่ใช่.
)
$()
ไม่ทำงานกับเชลล์เป้าหมายเก่า แต่เป็นเวลาหลายสิบปีมาแล้วที่ฉันทำงานกับ Bourne shell เก่า
หมายเหตุอื่น$()
จะใช้ทรัพยากรระบบมากกว่าการใช้ backticks แต่เร็วขึ้นเล็กน้อย
ในMastering Unix shell scripting , Randal K. Michael ได้ทำการทดสอบในบทที่ชื่อว่า "24 Ways to Process File Line-by-Line"
$()
ทำให้สคริปต์ของคุณมีขนาดใหญ่กว่าหนึ่งไบต์ถ้าใช้`
(สมมติว่าคุณไม่ซ้อนกันและไม่ใช้แบ็กสแลชภายใน) ซึ่งจะเร็วกว่าในการแยกที่จะแตกต่างกันระหว่างเปลือกหอยและจะไม่เกี่ยวข้องเล็กน้อยเมื่อเทียบกับค่าใช้จ่ายในการสร้างท่อและการฟอร์กของกระบวนการซึ่งการทดแทนคำสั่งเกี่ยวข้อง
หากต้องการเพิ่มสิ่งที่ผู้อื่นพูดที่นี่คุณสามารถใช้ backticks เพื่อจำลองความคิดเห็นแบบอินไลน์:
echo foo `# I'm a comment!` bar
ผลลัพธ์คือ: foo bar
.
ดูข้อมูลเพิ่มเติมได้ที่: https://stackoverflow.com/a/12797512 (โปรดสังเกตความคิดเห็นด้านล่างที่โพสต์นั้น)
$()
ไวยากรณ์จะไม่ทำงานกับบอร์นเชลล์เก่า
ด้วยเชลล์ที่ใหม่กว่า` `
และ$()
เทียบเท่า แต่$()
สะดวกกว่าเมื่อคุณต้องการซ้อนหลายคำสั่ง
ตัวอย่างเช่น
echo $(basename $(dirname $(dirname /var/adm/sw/save )))
ง่ายกว่าในการพิมพ์และตรวจแก้จุดบกพร่องกว่า:
echo `basename \`dirname \\\`dirname /var/adm/sw/save \\\`\``