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เป็นภาษาโปรแกรมเรียบง่ายมาก