สคริปต์ที่จะดำเนินการโดยล่ามโดยปกติจะมีบรรทัด Shebangที่ด้านบนเพื่อบอกระบบปฏิบัติการว่าจะดำเนินการอย่างไร
หากคุณมีสคริปต์ที่ชื่อfooซึ่งมีบรรทัดแรก#!/bin/shระบบจะอ่านบรรทัดแรกนั้นและดำเนินการเทียบเท่ากับ/bin/sh foo. ด้วยเหตุนี้ล่ามส่วนใหญ่จึงถูกตั้งค่าให้ยอมรับชื่อของไฟล์สคริปต์เป็นอาร์กิวเมนต์บรรทัดคำสั่ง
ชื่อล่ามที่ตามหลัง#!จะต้องเป็นเส้นทางแบบเต็ม ระบบปฏิบัติการจะไม่ค้นหา$PATHล่ามของคุณเพื่อค้นหาล่าม
หากคุณมีสคริปต์ที่ต้องดำเนินnodeการวิธีที่ชัดเจนในการเขียนบรรทัดแรกคือ:
#!/usr/bin/node
แต่จะไม่ได้ผลหากnodeไม่ได้ติดตั้งคำสั่งใน/usr/bin.
วิธีแก้ปัญหาทั่วไปคือการใช้envคำสั่ง (ซึ่งไม่ได้มีไว้เพื่อจุดประสงค์นี้จริงๆ ):
#!/usr/bin/env node
หากสคริปต์ของคุณถูกเรียกfooระบบปฏิบัติการจะเทียบเท่ากับไฟล์
/usr/bin/env node foo
envคำสั่งรันคำสั่งอื่นที่มีชื่อจะได้รับในบรรทัดคำสั่งผ่านข้อโต้แย้งใดต่อไปนี้คำสั่งว่า เหตุผลที่ใช้ที่นี่คือenvจะค้นหา$PATHคำสั่ง ดังนั้นหากnodeมีการติดตั้งใน/usr/local/bin/nodeและคุณมี/usr/local/binในของคุณ$PATHที่คำสั่งจะเรียกenv/usr/local/bin/node foo
วัตถุประสงค์หลักของenvคำสั่งคือการรันคำสั่งอื่นด้วยสภาพแวดล้อมที่แก้ไขเพิ่มหรือลบตัวแปรสภาพแวดล้อมที่ระบุก่อนรันคำสั่ง แต่ไม่มีอาร์กิวเมนต์เพิ่มเติมเพียงแค่รันคำสั่งด้วยสภาพแวดล้อมที่ไม่เปลี่ยนแปลงซึ่งเป็นสิ่งที่คุณต้องการในกรณีนี้
แนวทางนี้มีข้อบกพร่องบางประการ ระบบที่เหมือน Unix สมัยใหม่ส่วนใหญ่มี/usr/bin/envแต่ฉันทำงานบนระบบรุ่นเก่าที่มีการenvติดตั้งคำสั่งในไดเรกทอรีอื่น อาจมีข้อ จำกัด เกี่ยวกับอาร์กิวเมนต์เพิ่มเติมที่คุณสามารถส่งผ่านโดยใช้กลไกนี้ หากผู้ใช้ไม่มีไดเร็กทอรีที่มีnodeคำสั่งอยู่$PATHหรือมีการเรียกใช้คำสั่งnodeอื่นอาจเรียกใช้คำสั่งที่ไม่ถูกต้องหรือใช้งานไม่ได้เลย
แนวทางอื่น ๆ ได้แก่ :
- ใช้
#!บรรทัดที่ระบุพา ธ แบบเต็มไปยังnodeคำสั่งเองอัพเดตสคริปต์ตามความจำเป็นสำหรับระบบต่างๆ หรือ
- เรียกใช้
nodeคำสั่งด้วยสคริปต์ของคุณเป็นอาร์กิวเมนต์
ดูคำถามนี้ (และคำตอบของฉัน ) เพื่อดู#!/usr/bin/envเคล็ดลับเพิ่มเติม
อนึ่งในระบบของฉัน (Linux Mint 17.2) ติดตั้งเป็น/usr/bin/nodejsไฟล์. ตามบันทึกของฉันมันเปลี่ยนจาก/usr/bin/nodeเป็น/usr/bin/nodejsระหว่าง Ubuntu 12.04 และ 12.10 #!/usr/bin/envเคล็ดลับจะไม่ได้ความช่วยเหลือเกี่ยวกับที่ (ยกเว้นกรณีที่คุณตั้งค่า symlink หรือสิ่งที่คล้ายกัน)
UPDATE: ความคิดเห็นโดย mtraceur กล่าวว่า (ฟอร์แมตใหม่):
วิธีแก้ปัญหาสำหรับปัญหา nodejs vs node คือการเริ่มต้นไฟล์ด้วยหกบรรทัดต่อไปนี้:
#!/bin/sh -
':' /*-
test1=$(nodejs --version 2>&1) && exec nodejs "$0" "$@"
test2=$(node --version 2>&1) && exec node "$0" "$@"
exec printf '%s\n' "$test1" "$test2" 1>&2
*/
ขั้นแรกจะเป็นการลองnodejsแล้วจึงลองnodeและพิมพ์เฉพาะข้อความแสดงข้อผิดพลาดหากไม่พบทั้งสองข้อ คำอธิบายอยู่นอกขอบเขตของความคิดเห็นเหล่านี้ฉันแค่ทิ้งไว้ที่นี่เผื่อว่าจะช่วยให้ทุกคนจัดการกับปัญหาได้เนื่องจากคำตอบนี้ทำให้ปัญหาเกิดขึ้น
ฉันไม่ได้ใช้ NodeJS เมื่อเร็ว ๆ นี้ ความหวังของฉันคือปัญหาnodejsกับnodeปัญหาได้รับการแก้ไขแล้วในช่วงหลายปีที่ผ่านมาตั้งแต่ฉันโพสต์คำตอบนี้ครั้งแรก บน Ubuntu 18.04 nodejsแพคเกจจะติดตั้ง/usr/bin/nodejsเป็น symlink ไปยัง/usr/bin/node. ในระบบปฏิบัติการรุ่นก่อนหน้า (Ubuntu หรือ Linux Mint ฉันไม่แน่ใจว่าอันไหน) มีnodejs-legacyแพ็คเกจที่ให้nodeเป็น symlink nodejsไม่รับประกันว่าฉันมีรายละเอียดถูกต้องทั้งหมด
node