มันไม่จำเป็นต้องดีกว่า
ประโยชน์ของการ#!/usr/bin/env python
ก็คือว่ามันจะใช้สิ่งที่ปฏิบัติการปรากฏขึ้นครั้งแรกในของผู้ใช้python
$PATH
ข้อเสียของ#!/usr/bin/env python
ก็คือว่ามันจะใช้สิ่งที่ปฏิบัติการปรากฏขึ้นครั้งแรกในของผู้ใช้python
$PATH
นั่นหมายความว่าสคริปต์สามารถทำงานแตกต่างกันไปขึ้นอยู่กับว่าใครทำงานอยู่ สำหรับผู้ใช้หนึ่งรายอาจใช้สิ่ง/usr/bin/python
ที่ติดตั้งไว้กับระบบปฏิบัติการ อีกก็อาจจะใช้การทดลอง/home/phred/bin/python
ที่ไม่ได้ค่อนข้างทำงานอย่างถูกต้อง
และหากpython
ติดตั้งเฉพาะใน/usr/local/bin
ผู้ใช้ที่ไม่มี/usr/local/bin
ใน$PATH
จะไม่สามารถเรียกใช้สคริปต์ได้ (นั่นอาจไม่มากเกินไปสำหรับระบบที่ทันสมัย แต่อาจเกิดขึ้นได้ง่ายสำหรับล่ามที่ไม่ชัดเจน)
โดยการระบุ#!/usr/bin/python
คุณระบุว่าที่ล่ามจะใช้ในการเรียกใช้สคริปต์ในระบบโดยเฉพาะอย่างยิ่ง
ปัญหาที่อาจเกิดขึ้นอีกอย่างหนึ่งก็คือ#!/usr/bin/env
กลอุบายนั้นไม่อนุญาตให้คุณส่งอาร์กิวเมนต์ไปยังผู้แปล (นอกเหนือจากชื่อของสคริปต์ซึ่งถูกส่งผ่านโดยปริยาย) ซึ่งมักจะไม่ใช่ปัญหา แต่อาจเป็นไปได้ สคริปต์ Perl จำนวนมากเขียนด้วย#!/usr/bin/perl -w
แต่use warnings;
แนะนำให้มาแทนที่ในวันนี้ สคริปต์ Csh ควรใช้#!/bin/csh -f
- แต่ไม่แนะนำให้ใช้สคริปต์ csh ในตอนแรก แต่อาจมีตัวอย่างอื่น
ฉันมีสคริปต์ Perl จำนวนมากในระบบควบคุมแหล่งข้อมูลส่วนบุคคลที่ฉันติดตั้งเมื่อฉันตั้งค่าบัญชีในระบบใหม่ ผมใช้สคริปต์การติดตั้งที่ปรับเปลี่ยนสายของแต่ละสคริปต์ในขณะที่มันติดตั้งในของฉัน#!
$HOME/bin
(ฉันไม่ได้ใช้สิ่งอื่นนอกเหนือจาก#!/usr/bin/perl
เมื่อเร็ว ๆ นี้มันกลับไปเวลาเมื่อ Perl มักไม่ได้ติดตั้งโดยค่าเริ่มต้น)
จุดรอง: #!/usr/bin/env
เคล็ดลับคือเนื้อหาการใช้env
คำสั่งที่ไม่เหมาะสมซึ่ง แต่เดิมตั้งใจไว้ (ตามชื่อหมายถึง) เพื่อเรียกใช้คำสั่งที่มีสภาพแวดล้อมที่เปลี่ยนแปลง นอกจากนี้บางระบบเก่า (รวม SunOS 4 ถ้าผมจำได้อย่างถูกต้อง) ไม่ได้มีคำสั่งในenv
/usr/bin
สิ่งเหล่านี้ไม่น่าจะเป็นปัญหาสำคัญ env
ทำงานด้วยวิธีนี้สคริปต์จำนวนมากใช้#!/usr/bin/env
กลอุบายและผู้ให้บริการระบบปฏิบัติการไม่น่าจะทำทุกอย่างเพื่อทำลายมัน มันอาจจะมีปัญหาถ้าคุณต้องการสคริปต์ของคุณเพื่อให้ทำงานบนระบบเก่าจริงๆ แต่คุณก็มีแนวโน้มที่จะต้องปรับเปลี่ยนมันอยู่แล้ว
อีกปัญหาที่เป็นไปได้ (ขอบคุณ Sopalajo de Arrierez สำหรับการชี้ให้เห็นในความคิดเห็น) คืองาน cron ทำงานด้วยสภาพแวดล้อมที่ถูก จำกัด โดยเฉพาะอย่างยิ่งเป็นปกติบางอย่างเช่น$PATH
/usr/bin:/bin
ดังนั้นหากไดเรกทอรีที่มีล่ามไม่ได้เกิดขึ้นในไดเรกทอรีใดไดเรกทอรีหนึ่งแม้ว่าจะเป็นค่าเริ่มต้นของคุณ$PATH
ในเชลล์ผู้ใช้/usr/bin/env
เคล็ดลับก็จะไม่ทำงาน คุณสามารถระบุเส้นทางที่แน่นอนหรือคุณสามารถเพิ่มบรรทัดใน crontab ของคุณเพื่อตั้งค่า$PATH
( man 5 crontab
สำหรับรายละเอียด)