sh สามารถหมายถึงเชลล์เป้าหมายหรือ / bin / sh ซึ่งเป็นเชลล์ (สอดคล้องกับ POSIX) อื่น ๆ บนแพลตฟอร์มที่ทันสมัยที่สุด "POSIX shell" เป็นเชลล์นามธรรมที่กำหนดโดย POSIXซึ่งนำมาใช้โดยการทุบตีในโหมด POSIX หรือ ksh หรือเส้นประโดยค่าเริ่มต้น / bin / sh บางครั้งเรียกว่า POSIX เชลล์เนื่องจากเป็นเชลล์ที่สอดคล้องกับ POSIX บนแพลตฟอร์มส่วนใหญ่ เชลล์เป้าหมายเดิมไม่ใช่ POSIX เชลล์
bashref มีรายชื่อของความแตกต่างระหว่างการทุบตีและเปลือกหอยบอร์น man bash
มีรายชื่อของการเปลี่ยนแปลงเมื่อทุบตีถูกเรียกในโหมด POSIX
/ bin / sh ไม่ใช่ symlink หรือฮาร์ดลิงก์ใน OS X แต่มันมีขนาดใกล้เคียงกับ / bin / bash:
$ ls -li /bin/{ba,}sh
29631757 -r-xr-xr-x 1 root wheel 1333920 Jul 26 01:52 /bin/bash
29631758 -r-xr-xr-x 1 root wheel 1334000 Jul 26 01:52 /bin/sh
ทุบตีคน :
หาก bash ถูกเรียกใช้ด้วยชื่อ sh มันจะพยายามเลียนแบบพฤติกรรมการเริ่มต้นของ sh เวอร์ชั่นที่ผ่านมามากที่สุดเท่าที่จะทำได้ในขณะที่สอดคล้องกับมาตรฐาน POSIX เช่นกัน
การลอกเลียนแบบของบอร์นเชลล์นั้นค่อนข้าง จำกัด bash +B
(Bourne) จริง ๆ แล้วจะปิดการใช้งานคุณสมบัติเช่นการขยายรั้ง
$ sh
$ echo {a,b}
a b
$ echo $BASH_VERSION
3.2.48(1)-release
$ bash +B
$ echo {a,b}
{a,b}
แต่แม้ว่าคุณจะปิดใช้งานโหมด POSIX แต่เสียงก้องนั้นจะมีลักษณะecho -e
ดังนี้:
$ sh
$ shopt -uo posix
$ echo '1\b2'
2
/ bin / sh เป็นเส้นประบนUbuntuดังนั้นbashismsบางอย่างทำงานกับ / bin / sh บน OS X แต่ไม่ใช่ Ubuntu
หากคุณต้องการเขียนสคริปต์สำหรับบอร์นเชลล์ต้นฉบับ (เหมือน) คุณสามารถใช้#!/usr/bin/env bash +B
แทนได้
ฉันคิดว่าการเขียนสคริปต์สำหรับ bash ง่ายกว่าการหลีกเลี่ยงฟีเจอร์ที่ไม่ได้เป็นส่วนหนึ่งของข้อกำหนด POSIX หรือ Bourne shell หรือทดสอบทุกอย่างด้วย shell อื่น
sh
และbash
): http://en.wikipedia.org/wiki/Comparison_of_command_shells