SH คืออะไร
sh
(หรือ Shell Command Language) เป็นภาษาโปรแกรมที่อธิบายโดยมาตรฐาน POSIX แต่ก็มีการใช้งานจำนวนมาก ( ksh88
, dash
, ... ) bash
สามารถพิจารณาการดำเนินการของsh
(ดูด้านล่าง)
เนื่องจากsh
เป็นข้อมูลจำเพาะไม่ใช่การนำไปใช้/bin/sh
เป็น symlink (หรือฮาร์ดลิงก์) เพื่อนำไปใช้งานจริงในระบบ POSIX ส่วนใหญ่
ทุบตีคืออะไร
bash
เริ่มต้นเป็น - sh
ใช้งานร่วมกันได้ (แม้ว่าจะลงวันที่ก่อนหน้ามาตรฐาน POSIX โดยไม่กี่ปี) แต่เมื่อเวลาผ่านไปมันได้รับส่วนขยายจำนวนมาก ส่วนขยายเหล่านี้จำนวนมากอาจเปลี่ยนพฤติกรรมของสคริปต์เชลล์ POSIX ที่ถูกต้องดังนั้นโดยตัวมันเองbash
จะไม่เป็น POSIX เชลล์ แต่เป็นภาษาถิ่นของภาษาเชลล์ POSIX
bash
รองรับ--posix
สวิตช์ซึ่งทำให้เป็นไปตาม POSIX ได้มากขึ้น นอกจากนี้ยังพยายามที่จะเลียนแบบ POSIX sh
ถ้าเรียกว่าเป็น
sh = ทุบตี?
เป็นเวลานานที่/bin/sh
จะใช้ชี้ไป/bin/bash
ที่ระบบ GNU / Linux ส่วนใหญ่ เป็นผลให้มันเกือบจะปลอดภัยที่จะเพิกเฉยความแตกต่างระหว่างทั้งสอง แต่นั่นเริ่มเปลี่ยนไปเมื่อเร็ว ๆ นี้
ตัวอย่างที่นิยมของระบบที่/bin/sh
ไม่ได้ชี้ไปที่/bin/bash
(และในบางระบบ/bin/bash
อาจไม่มีอยู่) คือ:
- โมเดิร์น Debian และ Ubuntu ระบบซึ่ง symlink
sh
ไปdash
โดยค่าเริ่มต้น
- Busybox
initramfs
ซึ่งดำเนินการปกติในช่วงเวลาการบูตระบบลินุกซ์เป็นส่วนหนึ่งของ มันใช้การใช้ash
เปลือก
- BSDs และโดยทั่วไประบบที่ไม่ใช่ Linux OpenBSD ใช้
pdksh
ผู้สืบทอดของ Korn เชลล์ FreeBSD's sh
เป็นผู้สืบทอดของเชลล์ UNIX Bourne ดั้งเดิม Solaris มีของตัวเองsh
ซึ่งเป็นเวลานานไม่เป็นไปตาม POSIX; การดำเนินงานที่สามารถใช้ได้ฟรีจากโครงการ Heirloom
คุณจะทราบได้อย่างไรว่า/bin/sh
ระบบของคุณชี้ไปที่ใด?
ภาวะแทรกซ้อนคือ/bin/sh
อาจเป็นลิงก์สัญลักษณ์หรือลิงก์ยาก หากเป็นลิงก์สัญลักษณ์วิธีพกพาในการแก้ไขคือ:
% file -h /bin/sh
/bin/sh: symbolic link to bash
หากเป็นการเชื่อมโยงที่ยากลอง
% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash
ในความเป็นจริงการ-L
ตั้งค่าสถานะครอบคลุมทั้ง symlinks และ hardlinks แต่ข้อเสียของวิธีนี้คือมันไม่สามารถพกพาได้ - POSIX ไม่ต้องการ find
การสนับสนุน-samefile
ตัวเลือกแม้ว่าGNU findและFreeBSD จะพบการสนับสนุน
เส้น Shebang
ในที่สุดก็ขึ้นอยู่กับคุณที่จะตัดสินใจว่าจะใช้อันไหนโดยเขียนบรรทัด« shebang »
เช่น
#!/bin/sh
จะใช้sh
(และอะไรก็ตามที่เกิดขึ้นกับจุด)
#!/bin/bash
จะใช้/bin/bash
ถ้ามันมีอยู่ (และล้มเหลวพร้อมกับข้อความแสดงข้อผิดพลาดหากไม่มี) แน่นอนคุณสามารถระบุการนำไปใช้อื่นเช่น
#!/bin/dash
ใช้อันไหนดี
สำหรับสคริปต์ของฉันเองฉันชอบsh
ด้วยเหตุผลดังต่อไปนี้:
- มันเป็นมาตรฐาน
- มันง่ายกว่ามากและง่ายต่อการเรียนรู้
- มันเป็นแบบพกพาในระบบ POSIX - แม้ว่าพวกเขาจะไม่เกิดขึ้น
bash
พวกเขาจะต้องมีsh
มีข้อดีในการใช้bash
เช่นกัน คุณสมบัติต่างๆทำให้การเขียนโปรแกรมสะดวกและคล้ายกับการเขียนโปรแกรมในภาษาการเขียนโปรแกรมสมัยใหม่อื่น ๆ สิ่งเหล่านี้รวมถึงสิ่งต่าง ๆ เช่นตัวแปรและอาร์เรย์ในตัวเครื่อง ธรรมดาsh
เป็นภาษาโปรแกรมเรียบง่ายมาก