สคริปต์ที่จะดำเนินการโดยล่ามโดยปกติจะมีบรรทัด 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