ประเภทของเส้นทางใน shebang เป็นที่นิยมมากกว่า?


20

ในสคริปต์บรรทัดแรกควรระบุพา ธ ไปยังล่าม
แต่บนเซิร์ฟเวอร์ที่แตกต่างกัน Linux, Unix หรือ BSD เส้นทางนี้อาจแตกต่างกัน

สิ่งที่เป็นที่นิยมมากขึ้น?

#!/usr/bin/env bash 

หรือ

#!/bin/bash 

คำตอบ:


22

หากคุณต้องการใช้เวอร์ชันที่ติดตั้งระบบของล่ามที่กำหนดซึ่งติดตั้งในตำแหน่งมาตรฐานให้ใช้พา ธ โดยตรง หากคุณต้องการที่จะใช้สิ่งที่รุ่นของล่ามปรากฏครั้งแรกในของผู้ใช้$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

ถ้าอย่างนั้นมันก็จะถูกรันด้วยperlexecutable ที่ติดตั้งของตัวเอง- ซึ่งอาจไม่ใช่สิ่งที่ดี ผู้เขียนสคริปต์อาจยังไม่ได้ทดสอบด้วย Perl ที่มีสีซีดจางที่ฉันสร้างขึ้นจากแหล่งข้อมูลเมื่อเดือนที่แล้ว

สำหรับบางอย่างเช่น Perl หรือ Bash ที่น่าจะติดตั้งในตำแหน่งที่สอดคล้องกันในระบบส่วนใหญ่ ( /usr/bin/perlและ/bin/bashตามลำดับ) ฉันจะใช้เส้นทางตรงไปยังคำสั่ง สำหรับสิ่งที่คลุมเครือมากขึ้นที่สามารถติดตั้งแตกต่างกันในระบบที่แตกต่างกันฉันจะใช้/usr/bin/envเคล็ดลับหรือฉันจะเขียนโปรแกรมติดตั้งที่ปรับบรรทัด Shebang ในขณะที่สคริปต์กำลังติดตั้ง (ฉันเคยต้องทำเช่นนั้นสำหรับสคริปต์ Perl ของฉัน)

UPDATE:ฉันได้ไปลงในรายละเอียดอีกเล็กน้อยในคำตอบนี้ไปคำถามนี้บนเว็บไซต์ Unix และ Linux


ฉันเพิ่งเริ่มมองหา Ruby และฉันพบว่าการประชุมใน Ruby คือการเริ่มต้นด้วย [code] #! / usr / bin / env ruby ​​[/ code] เพื่อประโยชน์ในการพกพา บางคนตั้งข้อสังเกตว่าสิ่งนี้ทำให้ยากที่จะระบุอาร์กิวเมนต์บรรทัดคำสั่งให้กับตัวแปล ruby ​​เช่น '-w' ซึ่งจะเป็นปัญหาสำหรับ Perl
bgvaughan

@bgvaughan สำหรับ Perl มันเป็นแบบดั้งเดิมในปัจจุบันเพียงเพื่อใช้#!/usr/bin/perlและจากนั้นใช้ในร่างกายของสคริปต์มากกว่าuse strict; use warnings; #!/usr/bin/perl -wแต่-Tต้องเป็นใน shebang
Keith Thompson

ดังนั้นทำไมไม่ใช้ #! perl ถ้าเราแค่ต้องการอันแรกบนเส้นทาง?
wheredidthatnamecome จาก

@wheredidthatnamecomefrom: เพราะนั่นไม่ได้ผล การรักษาของเส้นไม่ได้ใช้#! $PATHคุณต้องระบุเส้นทางของล่าม (ฉันเพิ่งรู้ว่าอย่างน้อยในระบบของฉันก็สามารถเป็นเส้นทางญาติ แต่ไม่ค่อยมีประโยชน์)
Keith Thompson

6

วิธีปฏิบัติที่ดีที่สุดคือ:

#!/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
Martin Bonner สนับสนุน Monica

1

FYI มันเป็นชีปัง#!, #คุณต้องการ คุณใช้บรรทัดนี้เพื่อระบุล่ามที่จะเรียกใช้สคริปต์ด้วย

ตามค่าเริ่มต้น Ubuntu /bin/shจะเชื่อมโยงไปยังเส้นประ

ขึ้นอยู่กับว่าคุณอาจต้องการรู้เกี่ยวกับเส้นประมากน้อยเพียงใดและทำไมจึงมีการใช้ขีดกลางสำหรับระบบหรือเปลือกหอย deamon:

เส้นประ cyberciti.biz

หน้ามนุษย์อูบุนตู

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

สคริปต์ที่เขียนขึ้นสำหรับ Perl, Python ฯลฯ จะไม่ทำงานเลยด้วยหรือ/bin/sh/bin/bash

ดังนั้นเมื่อคุณเขียนสคริปต์คุณจะต้องระบุล่ามที่ควรใช้กับ shee-bang

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


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