Bash Shebang สำหรับหุ่น?


36

ฉันมีสคริปต์ทุบตีฉันมีการตั้งค่าที่ใช้เป็นส่วนใหญ่

#!/bin/bash

แต่ฉันพบบางอย่างที่ดูเหมือน

#!/bin/bash -e
#!/bin/bash -x
#!/bin/bash -ex

และอื่น ๆ

บางคนสามารถอธิบายความหมายและประโยชน์ของตัวเลือก shebang เหล่านี้และไม่ว่าพวกเขาจะนำไปใช้กับ shebang อื่น ๆ หรือไม่?


ตัวเลือกเหล่านี้มีเฉพาะสำหรับ Bash (หรือล่ามอื่น ๆ ) พวกเขาอาจเหมือนกันสำหรับเชลล์อื่น ๆ (เช่นขีดกลางและ ksh เป็นต้น) แต่พวกมันจะแตกต่างกันสำหรับล่ามอื่นเช่น AWK และ Python คุณสามารถใช้ตัวเลือกมากมายที่ล่ามยอมรับ ตัวเลือกมีเฉพาะสำหรับล่ามในขณะที่ shebang เป็นคุณลักษณะเคอร์เนล
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

คำตอบ:


41

ถ้าสคริปต์/path/to/fooเริ่มต้นด้วย#!/bin/bashแล้วการดำเนินการจะเทียบเท่ากับการดำเนินการ/path/to/foo arg1 arg2 /bin/bash /path/too/foo arg1 arg2ถ้าเส้น shebang คือมันจะเทียบเท่ากับการดำเนินการ#!/bin/bash -ex /bin/bash -ex /path/too/foo arg1 arg2คุณลักษณะนี้จัดการโดยเคอร์เนล

โปรดทราบว่าคุณ portably สามารถมีได้เพียงหนึ่งอาร์กิวเมนต์ในบรรทัด shebang: บาง Unices (เช่นลินุกซ์) ยอมรับเฉพาะอาร์กิวเมนต์หนึ่งเพื่อที่#!/bin/bash -e -xจะนำไปสู่การทุบตีได้รับอาร์กิวเมนต์เดียวห้าตัวอักษร-e -x(ข้อผิดพลาดทางไวยากรณ์) มากกว่าสองอาร์กิวเมนต์และ-e-x

สำหรับเชลล์เป้าหมายshและเชลล์ที่ได้รับเช่น POSIX sh, bash, ksh และ zsh:

  • -e หมายความว่าหากคำสั่งใด ๆ ล้มเหลว (ซึ่งบ่งชี้โดยการส่งคืนสถานะที่ไม่ใช่ศูนย์) สคริปต์จะยุติทันที
  • -x ทำให้เปลือกพิมพ์การติดตามการดำเนินการ

โปรแกรมอื่น ๆ อาจเข้าใจตัวเลือกเหล่านี้ แต่มีความหมายต่างกัน


24

เป็นตัวเลือกที่ส่งผ่านเพื่อbashดูhelp setข้อมูลเพิ่มเติมในกรณีนี้:

-x  Print commands and their arguments as they are executed.
-e  Exit immediately if a command exits with a non-zero status.

3
+1 และ-exทำทั้งสองอย่าง
Nifle

มันสับสนเพราะดูเหมือนว่าตัวเลือกบรรทัดคำสั่งที่ส่งผ่านไปยัง Bash
Caoilte

2
@Caoilte: และแน่นอนพวกเขามี (จาก):man bash In addition to the single-character shell options documented in the description of the set builtin command, bash interprets the following options when it is invoked: [...]
cYrus

1
โอ๊ย! กระพริบตาแล้วคุณจะพลาด! :)
Caoilte

0

ฉันอยากจะพูดถึงสิ่งที่ดียิ่งขึ้น - เหมือนพกพามากกว่า - ทางเลือก:

#!/usr/bin/env bash

ตัวอย่างข้างต้นการใช้งานenvเพื่อหาสิ่งที่ปฏิบัติการซึ่งไม่ได้เสมอที่bash /bin/bashYe olde #!/bin/bashscript ไม่ทำงานบนNixOSเช่น

หากคุณใช้envดังที่แสดงไว้ด้านบนคุณไม่สามารถโต้แย้งได้เช่น-eถึงbash(เท่าที่ฉันรู้) แต่คุณสามารถทำสิ่งนี้แทน:

#!/usr/bin/env bash
set -e

2
ฉันทำสิ่งนี้ตลอดเวลา แต่ฉันจะไม่พูดว่ามัน "พกพาได้มากกว่า" - อันที่จริงความเสี่ยงของการที่ผู้ใช้เรียกใช้บางสิ่งที่แตกต่างไปจากเดิมอย่างสิ้นเชิง ยกตัวอย่างเช่น Ubuntu ยังเรือทุบตี 4 ในขณะที่ผู้ใช้อาจเลือกที่จะใช้ทุบตี 5.
slhck

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