/ bin / dash คืออะไร


27

ฉันคิดว่า/bin/shเป็นการเชื่อมโยงไปยังเชลล์ที่ฉันเลือก ผมเคยใช้เสมอbashดังนั้นฉันคิดว่าจะชี้ไป/bin/sh แต่กลับกลายเป็นว่าที่จะชี้ไปที่/bin/bash/bin/dash

มันสนุกขึ้น ฉันเริ่มdashและทำecho $SHELLและมันพิมพ์/bin/bash(ดังนั้นโดยพื้นฐานแล้วมันเหมือนกันหรือไม่) อย่างไรก็ตาม man page ของdashแตกต่างอย่างสิ้นเชิงจาก man page ของbash(ดังนั้นจึงไม่เหมือนกันหรือไม่)


1
@wzzrd คำถามนี้เป็นคำถามเฉพาะสำหรับ linux หรือไม่
aioobe

1
ถอนหายใจฉันไม่สามารถลงคะแนนคำตอบที่ดีเหล่านี้ได้ทั้งหมดเนื่องจากฉันต้องการตัวแทน 15 คน ฉันรู้สึกพิการเพราะมี 18k ใน stackoverflow: - /
aioobe

4
mmm dash .. สิ่งที่เกี่ยวกับ / bin / crash (สำหรับแฟน gdb), / bin / slash (โปรแกรมความเข้มงวด), / bin / mash (ช่วงเวลายากลำบากในเกาหลี), / bin / sash (สำหรับเชียร์ลีดเดอร์), / bin / thrash (ฮาร์ดไดรฟ์ของคุณ), / bin / flash (แต่ถ้าคุณเข้ารหัสข้อมูลของคุณ), / bin / stash (ขอให้โชคดีพบมันในภายหลัง), / bin / cash (คุณเป็นคนจ่ายเงินเสมอ), / bin / pash (romancing PC), / bin / gash (aaargggh!)
PP

2
@PP - ฉันจะอ่าน / bin / thrash สำหรับแฟนเพลง Metal และ / bin / slash สำหรับแฟน ๆ ของมือกีต้าร์นำวงร็อคยุค 80 ... :-P
gWaldo

1
เหตุผลที่echo $SHELLพิมพ์/bin/bashคือเนื่องจากตัวแปรนั้นถูกตั้งค่าสำหรับเชลล์เริ่มต้นที่เริ่มต้นเมื่อคุณเข้าสู่ระบบมากกว่าเชลล์ปัจจุบันที่คุณกำลังทำงาน เริ่ม ksh หรือ zsh จาก Bash prompt และecho $SHELLจะยังพูด/bin/bashอยู่ ใช้psเพื่อดูสิ่งที่กำลังทำงานอยู่
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

คำตอบ:


43

Debian และ Ubuntu เปลี่ยนไปใช้ dash (iirc) เพราะมีสองอย่าง ก่อนอื่น Bash กลายเป็นเรื่องใหญ่ในช่วงหลายปีที่ผ่านมา ในความเป็นจริง/bin/bashไบนารีในระบบ Ubuntu 8.04 ของฉันเกือบสิบเท่า (!) ใหญ่พอ/bin/dashๆ ตอนนี้มันไม่สำคัญมากสำหรับการใช้กระสุนแบบวันต่อวัน แต่มันก็มีความสำคัญในสถานการณ์ต่อไปนี้:

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

ข้อเสียของการใช้ Dash แทนการทุบตีสำหรับการเขียนสคริปต์คือว่าคนจำนวนมากใช้ niceties การสร้างประโยคเพียงทุบตีได้ที่เรียกว่าBashisms ตัวอย่างของ Bashisms เป็นสตริงย่อยเช่นนี้

echo $SHELL
/bin/bash
a=1234567890
echo ${a}
1234567890
echo ${a:3}
4567890
echo ${a:3:1}
4

และนี่:

echo ${a#123}
4567890

Dash ในทางกลับกันส่วนใหญ่มีจุดมุ่งหมายที่จะเป็นไปตาม POSIX (และไม่มากไปกว่านั้น) จะทำให้คุณมีข้อผิดพลาดsubstition แย่หากคุณลองทำสิ่งนี้:

echo $SHELL
/bin/dash 
# actually, it will read /bin/bash above, because if you just run dash
# it will not set the $SHELL variable :)
a=1234567890
echo ${a}
1234567890
echo ${a:3}
dash: Bad substitution

เรื่องนี้จะสำคัญถ้าคุณใช้/bin/sh(และดังนั้นdash) เป็นล่ามสำหรับเชลล์ของคุณและใช้ Bashisms ในพวกเขา Debian และ Ubuntu มีหน้า wiki ที่ดีเกี่ยวกับ Bashisms และทำไมพวกเขาถึงไม่ดีใน shellscripts โดยทั่วไปและสคริปต์ init โดยเฉพาะ ดังนั้นคุณควรเลือกอย่างมีสติว่าคุณต้องการ/bin/shหรือ/bin/bashเป็นล่ามสำหรับสคริปต์ของคุณ

ไม่ควรใช้ Dash เป็นเชลล์เริ่มต้นในระบบของคุณ เพียงใช้ Bash สำหรับสิ่งนั้น เพื่อความสะดวกในการพกพาสคริปต์ของคุณคุณสามารถใช้ Dash ในฐานะล่ามเพื่อเพิ่มโอกาสที่สคริปต์จะรันบน Linux และ Unixes อื่น ๆ


1
หากคุณเขียนสคริปต์ด้วย Bashisms โปรดระบุ/bin/bash; ระบบที่ไม่ใช่ลีนุกซ์หลายแห่งมีshเชลล์จริงซึ่งไม่สามารถใช้งานร่วมกับbashมันได้
Chris S

echo ${a#123}ไม่ใช่ bashism เป็นส่วนหนึ่งของข้อกำหนดการขยายพารามิเตอร์ POSIX pubs.opengroup.org/onlinepubs/009695399/utilities/ ...... คุณไม่ได้รับรูปแบบการทุบตีขั้นสูงที่มีระดับสูงกว่านี้ส่วน posix เป็นรูปแบบสตริงย่อย + อักขระการขยายแบบง่าย ความหมาย POSIX ยังอนุญาตให้echo ${a#*6}
JM Becker



0

เนื่องจากเชลล์ไม่ได้ตั้งค่าทั้งหมด$SHELLเมื่อรันคุณจะพบเชลล์ปัจจุบันของคุณด้วย:

echo $0

หากมีข้อผิดพลาดมันเป็น csh มิฉะนั้นจะเป็นสิ่งที่argv[0]คุณเรียกใช้ซึ่งโดยทั่วไปจะเป็นเชลล์หรืออาจเป็นด้วย-เครื่องหมายยัติภังค์ชั้นนำเพื่อระบุว่าเป็นเชลล์การเข้าสู่ระบบ

สิ่งนี้ไม่ได้รับประกันเนื่องจากargv[0]อยู่ภายใต้การควบคุมของกระบวนการที่กล่าวอ้าง แต่ในทางปฏิบัตินั้นเป็นวิธีการที่เชื่อถือได้มากที่สุด

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