ในสคริปต์บรรทัดแรกควรระบุพา ธ ไปยังล่าม
แต่บนเซิร์ฟเวอร์ที่แตกต่างกัน Linux, Unix หรือ BSD เส้นทางนี้อาจแตกต่างกัน
สิ่งที่เป็นที่นิยมมากขึ้น?
#!/usr/bin/env bash
หรือ
#!/bin/bash
ในสคริปต์บรรทัดแรกควรระบุพา ธ ไปยังล่าม
แต่บนเซิร์ฟเวอร์ที่แตกต่างกัน Linux, Unix หรือ BSD เส้นทางนี้อาจแตกต่างกัน
สิ่งที่เป็นที่นิยมมากขึ้น?
#!/usr/bin/env bash
หรือ
#!/bin/bash
คำตอบ:
หากคุณต้องการใช้เวอร์ชันที่ติดตั้งระบบของล่ามที่กำหนดซึ่งติดตั้งในตำแหน่งมาตรฐานให้ใช้พา ธ โดยตรง หากคุณต้องการที่จะใช้สิ่งที่รุ่นของล่ามปรากฏครั้งแรกในของผู้ใช้$PATH
, #!/usr/bin/env ...
การใช้งาน
env
คำสั่งเรียกใช้คำสั่งที่ระบุให้คุณตั้งค่าหรือตัวแปรสภาพแวดล้อมที่ไม่มีการตั้งค่า:
env FOO=BAR do-something
env DISPLAY=:0.0 xterm -ls &
หากคุณไม่ได้ระบุตัวแปรสภาพแวดล้อมใด ๆ หรือตัวเลือกอื่น ๆ มันก็จะเรียกคำสั่งชื่อ (การใช้วิธีนี้จะเป็นการแฮ็กบิต)
จุดประสงค์ของการเขียน Shebang เป็น
#!/usr/bin/env interp
คือจะก่อให้เกิดสิ่งที่ปรากฏขึ้นเป็นครั้งแรกในinterp
$PATH
ซึ่งหมายความว่าคุณไม่ต้องรู้ว่าเมื่อเขียนสคริปต์ตรงที่interp
เป็น (พูดถ้ามันอาจจะเป็นทั้งใน/bin
, /usr/bin
หรือ/usr/local/bin
) แน่นอนคุณต้องรู้ว่านั่นenv
คือ/usr/bin/env
แต่ดูเหมือนว่าจะเป็นสากลพอสมควร
$PATH
ข้อดีคือมันจะเรียกแล้วแต่จำนวนใดรุ่นของล่ามปรากฏครั้งแรกในของผู้ใช้ ข้อเสีย$PATH
ก็คือว่ามันจะเรียกแล้วแต่จำนวนใดรุ่นของล่ามปรากฏครั้งแรกในของผู้ใช้
ตัวอย่างเช่นสมมติว่าผมได้ติดตั้งการสร้างส่วนบุคคลperl
ภายใต้ไดเรกทอรีบ้านของฉันเป็น$HOME/bin/perl
และฉันมีที่ด้านหน้าของฉัน$HOME/bin
$PATH
ถ้าฉันเรียกใช้สคริปต์ซึ่งเป็น shebang
#!/usr/bin/env perl
ถ้าอย่างนั้นมันก็จะถูกรันด้วยperl
executable ที่ติดตั้งของตัวเอง- ซึ่งอาจไม่ใช่สิ่งที่ดี ผู้เขียนสคริปต์อาจยังไม่ได้ทดสอบด้วย Perl ที่มีสีซีดจางที่ฉันสร้างขึ้นจากแหล่งข้อมูลเมื่อเดือนที่แล้ว
สำหรับบางอย่างเช่น Perl หรือ Bash ที่น่าจะติดตั้งในตำแหน่งที่สอดคล้องกันในระบบส่วนใหญ่ ( /usr/bin/perl
และ/bin/bash
ตามลำดับ) ฉันจะใช้เส้นทางตรงไปยังคำสั่ง สำหรับสิ่งที่คลุมเครือมากขึ้นที่สามารถติดตั้งแตกต่างกันในระบบที่แตกต่างกันฉันจะใช้/usr/bin/env
เคล็ดลับหรือฉันจะเขียนโปรแกรมติดตั้งที่ปรับบรรทัด Shebang ในขณะที่สคริปต์กำลังติดตั้ง (ฉันเคยต้องทำเช่นนั้นสำหรับสคริปต์ Perl ของฉัน)
UPDATE:ฉันได้ไปลงในรายละเอียดอีกเล็กน้อยในคำตอบนี้ไปคำถามนี้บนเว็บไซต์ Unix และ Linux
#!/usr/bin/perl
และจากนั้นใช้ในร่างกายของสคริปต์มากกว่าuse strict; use warnings;
#!/usr/bin/perl -w
แต่-T
ต้องเป็นใน shebang
#!
$PATH
คุณต้องระบุเส้นทางของล่าม (ฉันเพิ่งรู้ว่าอย่างน้อยในระบบของฉันก็สามารถเป็นเส้นทางญาติ แต่ไม่ค่อยมีประโยชน์)
วิธีปฏิบัติที่ดีที่สุดคือ:
#!/usr/bin/env bash
#!/usr/bin/env sh
#!/usr/bin/env python
และอื่น ๆ ...
เมื่อ Ubuntu เริ่มใช้ dash เป็นครั้งแรกสคริปต์บางตัวก็พัง มีการอภิปรายเกี่ยวกับเรื่องนี้ สคริปต์ส่วนใหญ่เขียนขึ้น#!/bin/sh
ซึ่งเป็นลิงก์ไปยัง / bin / bash ฉันทามติคือ: ผู้เขียนสคริปต์มีหน้าที่รับผิดชอบในการระบุล่าม ดังนั้นหากสคริปต์ของคุณควรถูกเรียกใช้ด้วย BASH เสมอให้ระบุจากสภาพแวดล้อม สิ่งนี้ช่วยให้คุณไม่ต้องเดาเส้นทางซึ่งแตกต่างกันไปตามระบบ Unix / Linux นอกจากนี้มันจะใช้งานได้ในวันพรุ่งนี้ / bin / sh กลายเป็นลิงค์ไปยังเชลล์อื่น ๆ เช่น / bin / wthsh หรือความไร้สาระอื่น ๆ
#!/bin/bash
การแก้ไขทางเลือกที่ชัดเจนสำหรับปัญหารีบที่จะเขียน ฉันยอมรับว่าผู้เขียนสคริปต์รับผิดชอบในการระบุล่าม แต่นั่นหมายความว่าถ้าคุณต้องการทุบตีต้องทุบตีไม่ใช่ sh
FYI มันเป็นชีปัง#!
, #
คุณต้องการ คุณใช้บรรทัดนี้เพื่อระบุล่ามที่จะเรียกใช้สคริปต์ด้วย
ตามค่าเริ่มต้น Ubuntu /bin/sh
จะเชื่อมโยงไปยังเส้นประ
ขึ้นอยู่กับว่าคุณอาจต้องการรู้เกี่ยวกับเส้นประมากน้อยเพียงใดและทำไมจึงมีการใช้ขีดกลางสำหรับระบบหรือเปลือกหอย deamon:
Bash เป็นเชลล์เริ่มต้นที่ผู้ใช้ Linux ส่วนใหญ่ใช้งานและมีคุณสมบัติที่แตกต่างกันตามมา สคริปต์ที่เขียนขึ้นสำหรับการทุบตีอาจหรืออาจทำงานได้ไม่ถูกต้องหากทำงานด้วยเครื่องหมายขีดกลางยิ่งสคริปต์มีความซับซ้อนมากเท่าใดก็ยิ่งมีโอกาสน้อยลงเท่านั้น
สคริปต์ที่เขียนขึ้นสำหรับ Perl, Python ฯลฯ จะไม่ทำงานเลยด้วยหรือ/bin/sh
/bin/bash
ดังนั้นเมื่อคุณเขียนสคริปต์คุณจะต้องระบุล่ามที่ควรใช้กับ shee-bang
การเลือกสิ่งที่จะใช้ทำโดยผู้เขียนของสคริปต์และอย่างใดอย่างหนึ่งไม่ดีกว่าที่อื่นพวกเขาทั้งหมดมีคุณสมบัติต่าง ๆ ข้อดีและข้อเสีย