มีเหตุผลใดบ้างที่จะต้องมี shebang ชี้ไปที่ / bin / sh แทนที่จะเป็น / bin / bash?


53

ในส่วนเชลล์สคริปต์ที่ผมเคยเห็น (นอกเหนือจากคนที่ฉันไม่ได้เขียนตัวเอง) ผมสังเกตเห็นว่า shebang #!/bin/shมีการตั้งค่า นี่ไม่ได้ทำให้ฉันแปลกใจกับสคริปต์เก่า ๆ แต่มันก็มีสคริปต์ใหม่ ๆ

มีเหตุผลในการเลือก/bin/shมากกว่า/bin/bashเนื่องจากbashแพร่หลายมากและมักจะเริ่มต้นในเครื่อง Linux และ BSD จำนวนมากจะกลับมาดีกว่าทศวรรษ?


23
มันเป็นส่วนที่ดีที่จะใช้/bin/shถ้าคุณไม่ได้ใช้bashฟังก์ชั่นที่เฉพาะเจาะจง วันหนึ่งคุณอาจต้องใช้สคริปต์ตัวใดตัวหนึ่งในระบบที่ไม่ได้ติดตั้ง (เซิร์ฟเวอร์ระยะไกลคอมพิวเตอร์ฝังตัว ... )
Mathieu

1
โดยทั่วไปคุณควรหลีกเลี่ยงการถามคำถามที่ยืมตัวให้ตอบตามความเห็น(ซึ่งเป็นวิธีที่เป็นไปได้เพียง แต่ผมเชื่อว่าคำถามนี้สามารถตอบได้ - แต่นั่นเป็นเพียงของฉันมีความคิดเห็น )
mikeserv

9
ฉันเชื่อว่าเป็นไปได้ที่จะตอบคำถามนี้โดยไม่เกี่ยวข้องกับความคิดเห็นเพียงชี้ไปที่องค์กรอย่างน้อยสองแห่งที่จัดการเรื่องนี้เป็นเวลาหลายปีและดูประวัติและผลลัพธ์ ด้วยการอ่านเพิ่มเติมจำนวนมากที่แนบมาเพื่อบูต ☺
JdeBP

3
@JulesMazur ...the answers so far are fairly subjective...คำสั่ง "อัตนัย" เป็นพื้นฐานความคิดเห็นตามนิยาม /bin/bashควรใช้เมื่อต้องการทุบตีอย่างชัดเจนเท่านั้น ในช่วง 40 ปีที่ผ่านมาในฐานะนักพัฒนาbashฉันไม่เคยต้องการมันอย่างชัดเจนยกเว้นเมื่อทำการทดสอบ (ฉันพยายามที่จะหลีกเลี่ยงส่วนขยายของเชลล์ด้วย แต่สคริปต์ส่วนใหญ่ของฉันมีจุดประสงค์เพื่อเผยแพร่) สคริปต์จำนวนมากในเน็ตควรมีไว้สำหรับการใช้งานที่กว้างขวาง
user2338816

2
@ user2338816 ของฉันไม่ดีฉันหมายถึงวัตถุประสงค์ ขอบคุณสำหรับคะแนน!
จูลส์

คำตอบ:


83
  1. มีระบบที่ไม่จัดส่ง bash เป็นค่าเริ่มต้น (เช่น FreeBSD)
  2. แม้ว่าจะมีการติดตั้ง bash แล้วมันอาจไม่อยู่ใน/binนั้น
  3. สคริปต์แบบง่าย ๆ ส่วนใหญ่ไม่ต้องใช้ bash
  4. การใช้ POSIX เชลล์สามารถพกพาได้มากขึ้นและสคริปต์จะทำงานบนระบบที่หลากหลายมากขึ้น

17
เหตุผลอื่น: บ่อยครั้ง / bin / sh เร็วกว่าทุบตีหรือโหลดเร็วกว่าอย่างน้อย (เนื่องจากเล็กกว่า)
derobert

5
derobert @, /bin/shได้เร็วขึ้นหากยังไม่ได้bashยังคงเป็นระบบน้อยเช่น OS / X หรือ RHEL ที่เป็น/bin/sh bash
Stéphane Chazelas

1
ไม่ระบบปฏิบัติการบางตัวเชื่อมโยงเพราะใช้งานร่วมกันได้กับ bash
Sobrique

7
ค่อนข้างไม่กี่สคริปต์คิดว่าเป็น/bin/sh /bin/bashUbuntu เปลี่ยนจากbashเป็นdashทั้งหมด
atamanroman

19
@atamanroman: สคริปต์ไม่ถูกต้องในตอนแรกพวกเขาควรจะใช้#!/bin/bashถ้าพวกเขาต้องการ Bash (ไม่มีอะไรผิดปกติกับมัน!) การเปลี่ยนแปลงส่วนใหญ่เกิดขึ้นที่ทวนน้ำในเดเบียน มันปรับปรุงประสบการณ์ผู้ใช้มันมีผลกระทบที่วัดได้ในเวลาเริ่มต้นระบบ นอกจากนี้ยังส่งผลกระทบต่อความปลอดภัยในเชิงบวกดู "Shellshock"
Dietrich Epp

28

สคริปต์ระบบส่วนใหญ่ใน (เกี่ยวข้องกับ Debian: Ubuntu, Mint, ฯลฯ ) Linux เขียนขึ้นเพื่อให้ทำงานได้เร็วขึ้นซึ่งเป็นค่าเริ่มต้น / bin / sh ในระบบเหล่านั้น เหตุผลคือสองเท่า:

  • ความเร็วของระบบ โค้ดขนาดเล็กที่โหลดได้เร็วกว่าและยังทำงานได้เร็วขึ้น ด้วยความพยายาม (เล็ก) เพิ่มเติมบางส่วน (ราคา) ให้โปรแกรมเมอร์ของเชลล์สคริปต์

  • ความปลอดภัย การมีหอยหลากหลายชนิดช่วยให้แมลงมีความยืดหยุ่น ระบบเดเบียนส่วนใหญ่ไม่ได้รับความเสี่ยงที่จะเกิดเชลล์เนื่องจากเชลล์เริ่มต้นไม่มีช่องโหว่ดังกล่าว

Bash นั้นเป็นเชลล์เริ่มต้นสำหรับผู้ใช้เช่นเดียวกับที่มีประสิทธิภาพมากขึ้นและมีองค์ประกอบมากมายที่จะทำให้การเขียนโปรแกรมง่ายขึ้น นอกจากนี้ยังเป็นค่าเริ่มต้นshใน Mac OS (อันที่เชื่อมโยงจาก / bin / sh) อย่างไรก็ตามการโทรbashด้วยชื่อลิงค์ของshทำให้มันเริ่มต้นเป็นเชลล์ที่สอดคล้องกับ posix


2
ชุดเครื่องมือที่ใช้งานได้ จำกัด มากขึ้นของเชลล์ที่เรียบง่ายทำให้การเขียนโค้ดยากขึ้น (โปรดหลีกเลี่ยงสงครามที่คลั่งไคล้ในเรื่องนี้) นั่นคือเหตุผลที่ผู้ใช้บางคนเช่น zsh ซึ่งมีเครื่องมือมากกว่าที่ใช้ทุบตี ฉันชอบ Bash มากขึ้นเนื่องจากมีความสมดุลระหว่างทั้งสองขั้ว

4
@RobertL มีสิ่งอำนวยความสะดวกมากมายที่เพิ่มเข้ามาใน ksh และมีการใช้งานโดยการทุบตีเพราะพวกเขาลดความซับซ้อนของกระบวนการในการเขียนสคริปต์ที่แข็งแกร่งและถูกต้อง หากไม่มีข้อมูลเพิ่มเติมที่อนุญาตให้ทำการมอบหมายและการประเมินผลทางอ้อมอย่างปลอดภัยเช่นสามารถค้นหาตัวเองได้โดยใช้evalความปลอดภัยของผู้ดูแล ในทำนองเดียวกันหากไม่มีการรองรับ regex ในตัวคุณสามารถใช้คำสั่งภายนอก (ที่มีประสิทธิภาพสูง) สำหรับการจับคู่แม้ในบรรทัดเดียว ฯลฯ
Charles Duffy

1
@RuiFRibeiro ไม่มีการเชื่อมโยงแบบคงที่ใน Debian ขีด จำกัด มากขึ้น แต่มีข้อ จำกัด ส่วนใหญ่ในคุณลักษณะแบบอินเทอร์แอคทีฟ
Jan Hudec

21

คนอื่น ๆ ชี้ให้เห็นว่าสถานที่ของคำถามที่ว่าบอร์นเชลล์อีกครั้งนั้นเป็นค่าเริ่มต้นและแพร่หลายเป็นความผิดอย่างสิ้นเชิง

นอกจากนั้นมีเหตุผลที่ดีที่จะใช้เชลล์ Bourne Again ในการตีความสคริปต์เชลล์ เหตุผลเหล่านี้มีแรงจูงใจในโครงการขนาดใหญ่ของ Ubuntu และ Debian ของกว่าหลายปีที่จะลบ bashisms และเพื่อให้เป็นจำนวนมากของเชลล์สคริปต์ที่ดำเนินการโดยเริ่มต้นระบบ (ซึ่งเป็นจำนวนมากของเชลล์สคริปต์ที่มีระบบ 5 rc) และแพคเกจกำจัด / ติดตั้งใช้Debian Almquist shellแทนเชลล์ Bourne Again

พูดง่าย ๆ : Bourne Again shell, หนุนเต็มไปด้วยคุณสมบัติการโต้ตอบตามที่เป็นอยู่มันไม่ได้เป็นล่ามเชลล์ที่เร็วที่สุดสำหรับเชลล์สคริปต์ที่สอดคล้องกับ POSIX ดังนั้นหากใครสามารถสร้างเชลล์สคริปต์ให้สอดคล้องกับ POSIX ให้ตีความโปรแกรมเหล่านั้นด้วยโปรแกรมที่มีน้ำหนักเบากว่าเช่น Debian Almquist shell ระบบของคนจะทำงานได้ดีขึ้น (ในท้ายที่สุดเดเบียนต้องทำการปรับเปลี่ยนเล็กน้อยกับ Almquist shell เพื่อเพิ่มการสนับสนุนสำหรับโครงสร้างที่ไม่ใช่ POSIX สองเชลล์ที่ลึกเกินไปและฝังลึกเกินไปและมีประโยชน์มากเกินไปที่จะกำจัด)

ผลที่ได้คือทุกอย่างเพิ่มขึ้นอย่างมากในประสิทธิภาพของ bootstrap

ดังนั้นจึงต้องพิจารณาเชลล์สองคลาสที่แตกต่างกันที่นี่:

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

โปรดทราบว่าการพูดถึงสิ่งนี้ในฐานะ "การเลือก/bin/sh" เป็นสิ่งที่เกินความคาดหมาย เดเบียนมีเป้าหมายอย่างน้อยสองเป้าหมาย:

  1. ในหน้าผู้ดูแลระบบที่ใช้เชลล์ Debian Almquist, Z Shell (ในโหมด POSIX), Bourne Again shell (ในโหมด POSIX), MirBSD Korn เชลล์และอื่น ๆ ตามที่/bin/shมี ...

    1. ... ทำให้สคริปต์เป็นแบบพกพาได้มากที่สุดดังนั้นการสลับสิ่งที่/bin/shแมปไปไม่ทำให้สิ่งแตกหัก หรือ

    2. ... การทำให้สคริปต์ที่ไม่ใช่แบบพกพากำหนดเป้าหมายโปรแกรมล่ามที่ถูกต้องอย่างชัดเจนแทนที่จะคาดหวัง/bin/shแผนที่นั้น

  2. มีการทำเด Almquist เปลือกทำแผนที่เริ่มต้นสำหรับการ/bin/shแทนของบอร์นเชลล์เพื่อให้สคริปต์เหล่านั้นที่เป็น POSIX สอดคล้อง (หรือถูกกว่าเดนโยบายคู่มือการใช้งานที่สอดคล้อง) วิ่งได้รวดเร็วยิ่งขึ้น

และแน่นอนว่าเมื่อมีใครเข้ามาในนี้ใคร ๆ ก็สามารถนำมันไปได้ไกลกว่านี้มาก เช่นการพิจารณาประสิทธิภาพการแลกเปลี่ยนของไลค์/bin/trueและ/usr/bin/clearการเป็นเชลล์สคริปต์หรือโปรแกรมที่คอมไพล์ แต่นั่นไม่ใช่คำตอบนี้โชคดีที่ ☺

สิ่งนี้ไม่ใหม่มากหรือแม้แต่เฉพาะยูนิกซ์แน่นอน ย้อนกลับไปก่อนศตวรรษที่ฉันเขียนและตีพิมพ์ล่ามบรรทัดคำสั่งที่มีทั้งรสชาติ "แบบโต้ตอบ" และ "ไม่โต้ตอบ" อธิบายส่วนนี้ใน doco และสังเกตความแตกต่างระหว่างตัวแปรCOMSPECและOS2_SHELLสภาพแวดล้อม ในทำนองเดียวกันการอภิปรายการลบ bashisms ใน System V ของ Debian rcและสคริปต์การติดตั้ง / กำจัดแพ็กเกจเริ่มต้นตั้งแต่ปี 1990

อ่านเพิ่มเติม


2
"ในท้ายที่สุดเดเบียนต้องทำการปรับเปลี่ยนเล็กน้อยให้กับ Almquist shell เพื่อเพิ่มการรองรับสำหรับโครงสร้างที่ไม่ใช่ POSIX สองอันที่ลึกเกินไปและฝังลึกเกินไปและมีประโยชน์มากในการกำจัด" - ลิงค์ใดที่คุณมีข้อมูลเกี่ยวกับสิ่งนี้ ฟังดูน่าสนใจมาก :)
สัญลักษณ์แทน

3
IMHO การแสดงเป็นเพียงแรงกระตุ้นให้คนเห็นด้วยกับการเปลี่ยนแปลง เหตุผลใหญ่สำหรับการเปลี่ยนแปลงครั้งแรกคือทุบตีนั้นทำลายความเข้ากันได้ย้อนหลัง ฉันต้องแก้ไขปัญหาทุบตีอย่างน้อย 3 ครั้งในอาชีพการงานของฉันเพราะสคริปต์จะทำงานในทุบตีรุ่นหนึ่ง แต่ล้มเหลวในอีกรุ่นหนึ่ง (มักเกิดขึ้นหลังจากอัปเกรดระบบปฏิบัติการ) Dash ไม่ได้เป็นเพียงล่ามที่เร็วขึ้น นอกจากนี้ยังมีเสถียรภาพมากขึ้นในแง่ของพฤติกรรม
slebetman

ฉันจะสนใจว่าความคิดเห็นในSchily Bourne Shellman page หรือไม่ดูที่schilytools.sourceforge.net/bosh.htmlเหมาะสมที่จะอนุญาตให้ผู้คนเข้าใจวิธีการเขียนสคริปต์แบบพกพา (ขึ้นอยู่กับBourne Shell features1989) สิ่งที่ฉันทำคือพูดถึงการปรับปรุงทุกอย่างที่ไม่ได้อยู่ใน Bourne Shells เก่า BTW: ฉันสนใจที่จะรู้รายการของ bashisms ในรีบ
schily

8

มีเหตุผลใดบ้างที่จะต้องมี shebang ชี้ไปที่ / bin / sh แทนที่จะเป็น / bin / bash?

ใช่. @ Marco's คำตอบที่ยอดเยี่ยมแสดงถึงสิ่งนี้ได้ดี

ฉันควรใช้อะไรใน shebang ของฉัน

เมื่อเขียนสคริปต์ของคุณเองคุณควรชีบชีทให้เป็นสิ่งทั่วไปที่สุดที่คุณทดสอบ

ในระบบของฉัน (Centos 6.6) shมีการเชื่อมโยงกับbash:

$ ls -l /bin/sh 
lrwxrwxrwx 1 root root 4 Dec  2  2014 /bin/sh -> bash

ซึ่งหมายความว่าฉันมักจะใช้#!/bin/bashใน shebang ของฉันเว้นแต่ฉันจะตรวจสอบว่าฉันไม่ได้ bashims ในสคริปต์ของฉัน

โดยการตั้งค่า shebang เพื่อคุณสัญญาว่าสคริปต์ที่จะทำงานร่วมกับการใช้งานของ#!/bin/shsh

นี่เป็นสัญญาที่ยิ่งใหญ่กว่าการบอกว่าสคริปต์จะใช้งานได้กับการทุบตี

นี่คือตัวอย่างของสคริปต์ที่จะทำงานไม่ถูกต้องขึ้นอยู่กับshการใช้งานระบบที่ใช้:

#!/bin/sh
n=1
a=$((++n))
echo $n

เมื่อใช้bashสคริปต์จะพิมพ์:

2

เมื่อใช้dashสคริปต์จะพิมพ์:

1

หากฉันต้องการใช้#!/bin/shสิ่งที่ฉันต้องทำ

  • ตรวจสอบสคริปต์ด้วยcheckbashisms- โปรดทราบว่านี่จะไม่พบ bashims ทั้งหมด ไม่พบความผิดพลาดในสคริปต์ของฉันด้านบน
  • ทดสอบสคริปต์โดยใช้shการนำไปใช้อื่น โดยทั่วไปแล้วฉันจะทดสอบด้วยdashอย่างไรก็ตามฉันคาดหวังว่า bashisms หรือ dashims บางตัวยังสามารถผ่านได้

หน้า DashAsBinShในวิกิพีเดียอูบุนตูมีจำนวนมากของข้อมูลที่น่าสนใจ


6
"เมื่อเขียนสคริปต์ของคุณเองคุณควรชีบให้เป็นเรื่องทั่วไปที่สุดที่คุณทดสอบกับ .... โดยการตั้งค่า shebang เป็น #! / bin / sh คุณสัญญาว่าสคริปต์จะทำงานร่วมกับการใช้งานทั้งหมดของ sh ." จุดที่ดีเยี่ยม +1 และคุณทำให้ฉันคิดใหม่ว่าฉันจะเขียน Shebangs ของฉันสำหรับอนาคตได้อย่างไร ขอขอบคุณ! :)
สัญลักษณ์แทน

2
การใช้งานไม่ได้ทั้งหมดของ/bin/sh; เพียงแค่คนที่สอดคล้องกับ POSIX
แบล็กไลท์ส่องแสง

4

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

/bin/shเป็นตัวแปลสคริปต์หนึ่งเดียวที่พร้อมใช้งานในทุกสิ่งที่เรียกตัวเองว่า Unix แต่ในระบบมรดกจำนวนมากอันน่ากลัว/bin/shและยูทิลิตี้ที่เกี่ยวข้องนั้นไม่สอดคล้องกับ POSIX.1-1996 "เชลล์และยูทิลิตี้" สเป็คให้ทุกอย่างทันสมัยยิ่งขึ้น เครื่องมือที่ได้มาตรฐานเป็นตัวเลือกเสริมติดตั้งใน/usr/xpg4หรือตำแหน่งที่ไม่ชัดเจนดังกล่าว 1 การ เขียนสคริปต์ไปยังภาษาของเชลล์แบบพกพาเซตย่อยน่าเบื่อกว่าและเกิดข้อผิดพลาดได้ง่ายกว่าการเขียนสคริปต์ไปยังภาษาของ POSIX เชลล์ (อ่านconfigureสคริปต์ที่สร้างโดย Autoconf บางครั้งถ้าคุณไม่เชื่อฉันเพียงแค่การตั้งค่าควรเพียงพอที่จะโน้มน้าวคุณ)

แต่ถ้าคุณสามารถสันนิษฐานได้ว่ามีการติดตั้งล่ามสคริปต์อื่น ๆ (เช่น Bash) คุณสามารถใช้ล่ามแปลภาษาสคริปต์ที่ดีกว่าได้ Perl, ตัวอย่างเช่นเป็นมากขึ้นมีแนวโน้มที่จะสามารถใช้งานได้กว่าทุบตี

ดังนั้นคุณไม่ควรเขียน#! /bin/bashสคริปต์เพราะถ้าเป็นตัวเลือกภาษาที่ดีกว่าก็เป็นตัวเลือกเช่นกัน

1ตัวอย่างเช่น Solaris 10 และผู้สูงอายุจัดส่งต้นฉบับเปลือกบอร์น/bin/shเป็น ฉันได้รับแจ้งว่า Solaris 11 อัปเดตเป็น ksh93


3
คุณจะเขียนสคริปต์เพื่อบู๊ตระบบในภาษาใด หรือภายในเราเตอร์ SOHO (ระบบ embebed ที่ จำกัด ) หรือใน Android? เชลล์จะพร้อมใช้งานในทุกกรณีเหล่านั้น Perl ไม่

1
มีบางอย่างที่ไม่ถูกต้องเกี่ยวกับ Solaris ที่เกี่ยวข้องกับคำตอบของคุณ บน Solaris 10 และรุ่นเก่า/bin/shคือไม่ POSIX.1-1996 แต่ที่จริงก่อน POSIX ไวยากรณ์เดิมบอร์นเชลล์ สิ่งนี้ทำให้#!/bin/shshebang ที่แย่มาก ๆ สำหรับสคริปต์ทำงานกับรีลีสเหล่านี้ สคริปต์แบบพกพาบน Solaris จะใช้#!/usr/xpg4/bin/shซึ่งจะไม่สามารถพกพาได้ในระบบปฏิบัติการอื่น ใน Solaris ล่าสุด Oracle Solaris 11 เปิดตัวครั้งแรกในปี 2011 /bin/shเป็นรูปแบบทันสมัยksh93ที่สอดคล้องกับ POSIX รายละเอียดล่าสุดและมีส่วนขยายที่ทันสมัยจำนวนมาก
jlliagre

1
@BinaryZebra: "A shell" จะมีให้เลือกใช่ แต่ bash ไม่จำเป็นว่าเชลล์ (โดยเฉพาะอย่างยิ่งเราเตอร์ SOHO ส่วนใหญ่ใช้ashซึ่งมีให้กับ busybox) และฉันมักจะคิดว่า zwol นั้นถูกต้องที่ perl มีให้ใช้มากกว่าทุบตี
Ben Voigt

1
@BenVoigt ฉันแสดงความคิดเห็นในประโยคนี้ "เหตุผลเดียวที่เหลือในการเขียนเชลล์สคริปต์" ยังมีบางอินสแตนซ์ที่ต้องการเชลล์สำหรับบางงาน (ไม่ใช่ทั้งหมด) นั่นคือบางส่วนจากส่วนหัวของฉัน OTOH ในระบบที่มีหน่วยความจำเพียงพอ (เกือบทั้งหมดเป็นมาตรฐานในปัจจุบัน) และการติดตั้ง Perl ที่เพียงพอ (หรือ Python หรือ .... ) นั้นค่อนข้างง่ายและรวดเร็ว อย่างไรก็ตามฉันไม่ได้เรียกร้องเปลือกเฉพาะใด ๆ คุณอ่านมันในความคิดเห็นของฉันที่ไหน?

2
ไม่เห็นด้วยอย่างเต็มที่กับการอ้างสิทธิ์ที่มีความคิดเห็นสูงและไม่เป็นทางการว่า "ถ้าbashมีให้บริการดังนั้นจึงเป็นภาษาที่ดีกว่าดังนั้นคุณไม่ควรเขียนbashโค้ดใด ๆเลย" นอกจากนี้ในฐานะ @sixtyfootersdude ชี้ให้เห็นคุณควรเสมอใช้#!/bin/bashจนกว่าคุณจะได้รับการทดสอบว่าสคริปต์ของคุณทำงานกับเปลือก POSIX
สัญลักษณ์แทน

0

คุณควรใช้จริง

#! /bin/env sh

หรือ

#! /bin/env bash

วิธีที่คุณเรียกใช้เชลล์โดยวิธีที่พวกเขาติดตั้งบนระบบนั้น

เพื่อความปลอดภัยสุด ( เช่นในกรณีของการเริ่มต้นใหม่ผู้เดียว) ใช้อย่างอื่นใช้shbash


6
จากคำตอบนี้ : the advantage of #!/usr/bin/env python is that it will use whatever python executable appears first in the user's $PATH. The disadvantage of #!/usr/bin/env python is that it will use whatever python executable appears first in the user's $PATH.นี้น่าจะยังนำไปใช้และsh bash
จูลส์

12
ไม่คุณไม่ควรใช้#!/bin/envอะไรในสคริปต์แบบพกพา มันสมเหตุสมผลอย่างสมบูรณ์ที่จะสมมติว่า/bin/shมีอยู่และเป็นเชลล์ที่ทำงานได้กับ POSIX บนมืออื่น ๆ /bin/envที่ไม่มีระบบของฉันมี
แบล็กไลท์ส่องแสง

ยังเป็นจุดที่ดี
จูลส์

1
@Blacklight Shining เป็นมั่นเหมาะผิดที่จะถือว่า POSIX /bin/shเปลือกสอดคล้องใน POSIX ไม่ต้องการและค่อนข้างจะกำหนดกฎอื่น ๆ เพื่อให้ได้สภาพแวดล้อมที่สอดคล้องกับ POSIX บนแพลตฟอร์มที่ได้รับการรับรอง POSIX
schily

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