มีสองไวยากรณ์สำหรับการทดแทนคำสั่ง: ด้วยดอลลาร์วงเล็บและ 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 \\\`\``