ทำไม sh -c 'echo -n 1' จึงแตกต่างจาก bash -c 'echo -n 1'


1

ฉันใช้ Mac Book Air, OSX 10.8

ฉันพยายามเข้าใจว่าเพราะเหตุใดข้อมูลโค้ดทั้งสองนี้จึงไม่พิมพ์ผลลัพธ์เดียวกัน sh -c 'echo -n 1'เอาท์พุท-n 1ในขณะที่ bash -c 'echo -n 1'เอาท์พุท1ตามที่คาดไว้

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


มีเหตุผลใดบ้างที่คุณต้องการให้มันเข้าคู่กันเหมือนตอนแรกที่มันถูกเรียกใช้งานในสองเชลล์ที่แตกต่างกัน? เมื่อเขียนเชลล์สคริปต์คุณสามารถระบุเชลล์ที่จะใช้ซึ่งควรแก้ไขปัญหาการพกพาได้หลายอย่าง
เจอร์รี่

คำตอบ:


3

เพราะเห็นได้ชัดว่า Mac OS เป็นหนึ่งในระบบที่ตอบสนองต่อxpg_echoตัวเลือกเมื่อทำงานในโหมด POSIX การรัน bash เป็น / bin / sh เทียบเท่ากับการรันด้วย--posixหรือตั้งค่า POSIXLY_CORRECT

ทางออกคือหยุดใช้echoยกเว้นในกรณีที่ไม่มีความกำกวม printfเป็นอุปกรณ์ทดแทนแบบพกพา อย่าใช้ตัวเลือกการตั้งค่าสถานะเพื่อสะท้อน (และใช้printfถ้าคุณ)

มีการใช้งานในอดีตที่เข้ากันไม่ได้หลายอย่างechoซึ่งทำลายข้อกำหนดของมันในลักษณะที่ไม่สามารถแก้ไขได้และธงตัวเลือกจึงไม่สามารถพกพาได้ ฉันไม่ทราบว่ามีสิ่งใดที่ใช้ POSIX echoอย่างถูกต้องในปัจจุบัน

shopt -u xpg_echoควรแก้ไขพฤติกรรมนี้ เช่นเดียวกับที่คุณค้นพบแล้วไม่ได้ทำงานในโหมด POSIX

นอกจากนี้คุณอาจต้องการอัปเกรด ... bash 3 เริ่มมีค่าเล็กน้อย ข้อบกพร่องหลายอย่างได้รับการแก้ไขตั้งแต่


shและbash --posixไม่เทียบเท่า นอกจากนี้ยังสนับสนุนbash --posix -n
Lri

@LauriRanta AFAICT พวกเขาเทียบเท่ากัน ผมเริ่มคิดว่าเกี่ยวกับ-nเช่นกัน xpg_echoแต่ไม่ได้อยู่ในการรวมกันกับ คุณต้องการทั้งคู่ หาก xpg_echo ถูกเปิดใช้งานในโหมด POSIX จะปรากฏว่า Bash ทำตาม POSIX (ที่มีกฎ XSI) ตามechoจริง หมายเหตุพฤติกรรม xpg_echo สามารถกำหนดค่าเป็นค่าเริ่มต้นในเวลารวบรวม
ormaaj

xpg_echoถูกกำหนดโดยค่าเริ่มต้นเป็น sh แต่ไม่ได้ตั้งค่าbash --posixดังนั้นฉันจะไม่พูดว่ามันเท่ากัน พฤติกรรมการเริ่มต้นของ sh ก็แตกต่างจากbash --posixตามหน้า bash man
Lri

@LauriRanta น่าสนใจฉันไม่มี OS X เพื่อทดสอบและใช้งานคอมไพล์ของ Bash อาจจะมีเป็นค่าเริ่มต้นมันตีความพฤติกรรมเมื่อทำงานxpg_echo bash --posixฉันต้องดูมัน นอกจากนี้คุณเห็นว่าในคู่มือ? แก้ไขตกลงฉันรู้ว่าคุณกำลังพูดถึงอะไร ฉันไม่เชื่อว่ามีผลกับสิ่งอื่นนอกจากพฤติกรรมการเข้าสู่ระบบ
ormaaj

1

/bin/shเป็นรุ่นทุบตีที่เริ่มต้นในโหมด POSIX ( bash --posix) และยังมีการเปลี่ยนแปลงอื่น ๆ ความแตกต่างอีกประการหนึ่งคือมันตีความการหลบหนีลำดับโดยค่าเริ่มต้น:

$ bash -c "echo 'a\ba'"
a\ba
$ sh -c "echo 'a\ba'"
a
$ sh -c "shopt -u xpg_echo; echo 'a\ba'"
a\ba
$ bash --posix -c "echo 'a\ba'"
a\ba

printf %s จะทำงานในลักษณะเดียวกันในสภาพแวดล้อมส่วนใหญ่

คุณสามารถเขียนสคริปต์เพื่อทุบตีได้ด้วย sh ของ OS X ไม่ได้ป้องกันคุณจากการใช้Bashismsที่อาจใช้ไม่ได้กับ/bin/shแพลตฟอร์มอื่น ๆ เช่น dash บน Ubuntu

ดูคำถามนี้และส่วนเกี่ยวกับ echo บนเว็บไซต์นี้

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