เชลล์ตัวไหนรันสคริปต์เมื่อไม่มีบรรทัด shebang (#! / path / to / shell) ที่จุดเริ่มต้น? ฉันถือว่า / bin / sh แต่ฉันไม่สามารถยืนยันได้
เคอร์เนลปฏิเสธที่จะรันสคริปต์ดังกล่าวและผลตอบแทน ENOEXEC ดังนั้นพฤติกรรมที่แน่นอนขึ้นอยู่กับโปรแกรมที่คุณเรียกใช้สคริปต์ดังกล่าวจาก
- bash 4.2.39 - ใช้ตัวมันเอง
- busybox-ash 1.20.2 - ใช้ตัวมันเอง
- เส้นประ 0.5.7 - วิ่ง / bin / sh
- ปลา 1.23.1 - บ่นเกี่ยวกับ ENOEXEC แล้วโทษไฟล์ผิด
- AT&T ksh 93u + 2012.08.01 - ใช้ตัวมันเอง
- mksh R40f - ทำงาน / bin / sh
- pdksh 5.2.14 - ทำงาน / bin / sh
- sh-heirloom 050706 - ใช้ตัวมันเอง
- tcsh 6.18.01 - ทำงาน / bin / sh
- zsh 5.0.0 - วิ่ง / bin / sh
- cmd.exe 5.1.2600 - ดูแล้วคุณตลก
ในglibc , ฟังก์ชั่นexecv()
หรือexecve()
เพียงแค่คืนค่า ENOEXEC แต่execvp()
ซ่อนรหัสข้อผิดพลาดนี้และจะเรียกใช้ / bin / sh โดยอัตโนมัติ (นี่คือเอกสารในexec (3p) )
อะไรคือ "แนวทางปฏิบัติที่ดีที่สุด" ในแง่ของการเขียนเชลล์สคริปต์ที่จะทำงานบนแพลตฟอร์มใด ๆ (ตกลงนี่เป็นแบบปลายเปิด)
ทั้งติดsh
และคุณสมบัติเฉพาะ POSIX ที่กำหนดไว้หรือเพียงแค่ไปเต็มทุบตี (ซึ่งสามารถใช้ได้อย่างกว้างขวาง) และพูดถึงมันในความต้องการของคุณถ้ากระจาย
(ตอนนี้ฉันคิดว่ามัน Perl - หรือบางทีหลาม - จะพกพามากขึ้นไม่ต้องพูดถึงว่ามีไวยากรณ์ที่ดีกว่า)
เสมอเพิ่มบรรทัด shebang หากใช้ bash หรือ zsh ให้ใช้#!/usr/bin/env bash
แทน hardcoding พา ธ ของเชลล์ (อย่างไรก็ตาม POSIX เชลล์รับประกันว่าจะเป็น/bin/sh
ดังนั้นให้ข้ามenv
ในกรณีนั้น)
(น่าเสียดายที่แม้/bin/sh
จะไม่เหมือนกันเสมอโปรแกรมautoconf ของ GNU ต้องจัดการกับนิสัยใจคอต่างๆ )
เป็นไปได้ไหมที่จะเขียนสคริปต์ที่พยายามใช้ zsh และกลับไปใช้ทุบตีหาก zsh ไม่พร้อมใช้งาน? ฉันได้ลองใส่ Shebang สองบรรทัดอย่างเช่นด้านล่าง แต่มันเป็นแค่ข้อผิดพลาดกับล่ามที่ไม่ดี: / bin / zsh: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าวถ้าฉันลองใช้กับเครื่องที่ไม่มี zsh
สามารถมีได้เพียงเส้นเดียวเท่านั้น ทุกอย่างหลังจากอักขระขึ้นบรรทัดใหม่ไม่ได้ถูกอ่านโดยเคอร์เนลและถือว่าเป็นความคิดเห็นโดยเชลล์
เป็นไปได้ที่จะเขียนสคริปต์ที่ทำงานเป็น#!/bin/sh
ตรวจสอบว่าเชลล์ใดที่พร้อมใช้งานและรันexec zsh "$0" "$@"
หรือexec bash "$0" "$@"
ขึ้นอยู่กับผลลัพธ์ อย่างไรก็ตามไวยากรณ์ที่ใช้โดย bash และ zsh นั้นแตกต่างกันมากในหลาย ๆ ที่ที่ฉันไม่แนะนำให้ทำเพื่อความมีสติของคุณ