เหตุผลใดที่จะใช้หรือสอนการทดแทน '…' เพื่อการพัฒนาใหม่?


16

มันเป็นความเข้าใจของฉันว่า$(...)ไวยากรณ์แทนคำสั่งที่ทันสมัยกว่าเป็นที่ต้องการมากกว่า`ไวยากรณ์แบบเก่าเนื่องจากง่ายต่อการทำรังและหลบหนีจากข้อผิดพลาด

นอกจากนี้ดูเหมือนว่า/bin/shกระสุนสไตล์ส่วนใหญ่ในการสนับสนุนการใช้งานที่ทันสมัย$(…):

  • ทุบตี
  • เถ้า (และดังนั้น BusyBox, Linux ส่วนใหญ่ที่ฝังตัว)
  • ชน
  • FreeBSD / bin / sh

และ$(…)ถูกระบุโดย IEEE 1003.1

ดังนั้นฉันมี 2 คำถามที่เกี่ยวข้องมาก:

  • มีเหตุผลใดบ้างที่จะใช้ `ในการพัฒนาเชลล์สคริปต์ใหม่เว้นแต่คุณจะรู้ถึงระบบเก่าที่สคริปต์จะต้องทำงาน
  • มีเหตุผลใดที่จะไม่สอนนักเรียนโปรแกรม UNIX เพียงเพื่อเขียน$(...)และอภิปราย`เฉพาะในรูปแบบที่ล้าสมัยที่พวกเขาจะพบถ้าพวกเขากำลังอ่านเชลล์สคริปต์ของผู้พัฒนาคนอื่น (และอาจจำเป็นถ้าพวกเขากำลังทำงานกับระบบเก่าหรือไม่เป็นมาตรฐาน ด้วยเหตุผลบางอย่าง)?

7
`...`ไม่มีจุดโดยใช้การเรียนการสอนหรือไม่ มันมีไว้สำหรับการพกพาแบบย้อนหลังด้วย Bourne shell เท่านั้น (เช่น Bourne shell มี^(เหมือน|)) สำหรับการพกพาแบบย้อนหลังด้วย Thomson shell โปรดทราบว่า(t)cshไม่มี$(...)(แต่ก็ไม่มีประเด็นที่ใช้หรือสอนพวกเขามากนัก)
Stéphane Chazelas

2
มันเป็นสิ่ง Groucho Marx `; {)
goldilocks

2
เดี๋ยวก่อน backticks ถูกคัดออก ?? ไม่มีใครมีการอ้างอิงที่ยอมรับได้อธิบายว่าทำไม? (อักขระไวยากรณ์แปลก ๆ นั้นยากมากที่จะค้นหา)
MathematicalOrchid

1
พิมพ์ง่ายกว่า `` - 2 ปุ่มกด; $()- shift + 4,9, shift + 0 - 5 ปุ่มกด;
วิ

3
@MathematicalOrchid stackoverflow.com/questions/9405478/…ดูเหมือนดีทีเดียว Backticks ยากที่จะซ้อนอย่างถูกต้องโดยเฉพาะเมื่อมีการพูดเพิ่มเติม
Michael Ekstrand

คำตอบ:


19

เนื่องจากมีการใช้เห็บหลังบ่อยครั้งจึงเหมาะสมที่จะสอนโครงสร้างประโยคนี้

แน่นอนว่า$()ควรเน้นการทดแทนคำสั่ง style เป็นสไตล์เริ่มต้น (และสร้างตามมาตรฐาน)

ทำไมเห็บกลับยังเป็นที่นิยม เพราะพวกเขาช่วยตัวละครตัวหนึ่งในการพิมพ์และพวกเขาก็จะหนักตาน้อยลง


18
ฉันจะไม่อธิบายลักษณะ "หนักน้อยลงในตา" เป็นคุณลักษณะ แต่ข้อผิดพลาด ...
jasonwryan

1
โดยปกติฉันใช้ backsticks ในกรณีง่าย ๆ และ $ () ในกรณีที่ซับซ้อน แต่สคริปต์จำนวนมากกำลังใช้ backsticks จนถึงตอนนี้และผู้จบต้องมีขอบเขตกับพวกเขา
peterh - Reinstate Monica

@ jasonwryan ในกรณีนั้นข้อผิดพลาดไม่ใช่เพราะความกะทัดรัด แต่เป็นเรื่องของปัญหาโดยพลการ นั่นคือการใช้ backticks นั้นง่ายต่อการมองเห็น แต่นั่นไม่ใช่เหตุผลว่าทำไมจึงมีค่าเสื่อมราคา ถ้าคุณพยายามที่จะพูดว่าน้ำตาลเป็นคำจำกัดความที่ไม่ดีและเราทุกคนควรเลือกใช้ asm สำหรับสิ่งที่ ... จริง ๆ แล้วฉันชอบรูปลักษณ์ที่$()ดีกว่า แต่ backticks ง่ายกว่าและจูบมากกว่า อาจเป็นผล pavlovian OCDish ผลของการเขียนโปรแกรมทั่วไป
goldilocks

@goldilocks เมื่อคุณได้รับเก่าการอ่านจึงเป็นเรื่องยากมากอยู่แล้ว: backticks เป็นจริงที่มองไม่เห็นในรหัสที่อายุของฉัน ...
jasonwryan

3
บนแป้นพิมพ์ภาษาฝรั่งเศสเช่น`เป็น Altrg + E (อึดอัดใจที่จะพิมพ์) ในขณะที่$, (, )ไม่จำเป็นต้องปรับแต่งใด ๆ
Stéphane Chazelas

5

ฉันจะไม่ใช้มันสำหรับการเขียนโปรแกรมและการสอนการใช้การทดแทน backtick ในเชลล์สคริปต์เนื่องจากล้าสมัยดี (ดูเหมือนว่าจะเป็นฉันทามติ) ฉันไม่คิดว่าพวกเขาชั่วร้ายโดยเนื้อแท้และ (อย่างน้อยการตัดสินโดยบทช่วยสอนเฉลี่ยของคุณไปยังบรรทัดคำสั่ง Linux) พวกเขายังคงใช้บ่อยในตัวอย่างง่ายๆ / หนึ่ง-liners ที่พวกเขาอาจจะไม่ซ้อนและสิ่งที่คุณ แค่ทำครั้งเดียว

ดูการทดแทนคำสั่ง: backticks หรือเครื่องหมายดอลลาร์ / paren ล้อมรอบ? .


1

ฉันหลีกเลี่ยงการใช้สิ่ง$()ก่อสร้างเพราะมันไม่สามารถพกพาได้ - ในโลกแห่งความเป็นจริง คุณได้แสดงสี่เชลล์ - มีหลายรูปแบบมากกว่าที่อยู่รอบ ๆ (ลำดับความสำคัญ?) ลองเรียกใช้สคริปต์ของคุณใน Solaris / bin / sh และดูว่าคุณไปอย่างไร

ในทางกลับกันคุณหยุดสนับสนุนระบบเก่าเมื่อใด คุณไม่เคยก้าวหน้าในวิธีการทำสิ่งใหม่ ๆ หรือไม่? ฉันคิดว่าคุณควรเชื่อมั่นในการตัดสินใจของคุณเองและถ้าคุณสามารถเห็นข้อได้เปรียบที่ชัดเจนของวิธีการใหม่ ๆ แบบเก่า ๆ ไปเลย ... นี่ไม่ใช่หนึ่งในนั้น (โดยส่วนตัวแล้วฉันพบว่า bacticks ชัดเจนมากขึ้น สับสนกับการทดแทนตัวแปรเชลล์ซึ่งแตกต่างกัน)


1
POSIX ไม่ได้ระบุว่า/bin/shจะต้องสอดคล้อง Solaris /bin/shนั้นไม่สอดคล้องกันมาก - แม้ว่า Solaris 9/10 / ... เป็นไปตาม POSIX อย่างเป็นทางการ $()เป็นเพียงหนึ่งในการสร้างมันไม่เข้าใจ แต่มีอีกมากมายที่ไม่เข้าใจหรือตีความแตกต่างกัน วิธีแบบพกพาที่จะได้รับตามนโยบายที่จะค้นหามันในเส้นทางที่ส่งกลับโดยsh getconf PATH
maxschlepzig
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.