एक दुभाषिया द्वारा निष्पादित की जाने वाली लिपियों में आमतौर पर ओएस को बताने के लिए शीर्ष पर एक शबंग रेखा होती है।
यदि आपके पास एक स्क्रिप्ट है fooजिसका नाम पहली पंक्ति है #!/bin/sh, तो सिस्टम उस पहली पंक्ति को पढ़ेगा और उसके बराबर निष्पादित करेगा /bin/sh foo। इस वजह से, अधिकांश व्याख्याकारों को एक स्क्रिप्ट फ़ाइल का नाम कमांड-लाइन तर्क के रूप में स्वीकार करने के लिए स्थापित किया जाता है।
इंटरप्रेटर नाम के बाद #!एक पूर्ण पथ होना चाहिए; ओएस $PATHदुभाषिया खोजने के लिए आपकी खोज नहीं करेगा ।
यदि आपके पास निष्पादित करने के लिए एक स्क्रिप्ट है node, तो पहली पंक्ति लिखने का स्पष्ट तरीका है:
#!/usr/bin/node
लेकिन यह काम नहीं करता है यदि nodeकमांड स्थापित नहीं है /usr/bin।
envकमांड का उपयोग करने के लिए एक आम समाधान है (जो वास्तव में इस उद्देश्य के लिए अभिप्रेत नहीं था ):
#!/usr/bin/env node
यदि आपकी स्क्रिप्ट को कॉल किया जाता है foo, तो OS बराबर होगा
/usr/bin/env node foo
envआदेश एक और आदेश जिसका नाम अपने कमांड लाइन पर दिया जाता है कार्यान्वित करता है, कि आदेश के लिए किसी भी निम्नलिखित तर्क गुजर। यहां इसका उपयोग करने का कारण यह है कि कमांड के लिए envखोज करेंगे $PATH। तो अगर आप nodeमें स्थापित है /usr/local/bin/node, और आपके पास /usr/local/binहै $PATH, तो envकमांड आ जाएगी /usr/local/bin/node foo।
envकमांड का मुख्य उद्देश्य एक अन्य कमांड को संशोधित वातावरण के साथ निष्पादित करना है, कमांड चलाने से पहले निर्दिष्ट पर्यावरण चर को जोड़ना या निकालना। लेकिन कोई अतिरिक्त तर्क के साथ, यह सिर्फ अपरिवर्तित वातावरण के साथ कमांड को निष्पादित करता है, जो आपको इस मामले में चाहिए।
इस दृष्टिकोण में कुछ कमियां हैं। अधिकांश आधुनिक यूनिक्स जैसी प्रणालियां हैं /usr/bin/env, लेकिन मैंने पुराने सिस्टम पर काम किया है जहां envएक अलग निर्देशिका में कमांड स्थापित किया गया था। अतिरिक्त तर्कों पर सीमाएं हो सकती हैं जिन्हें आप इस तंत्र का उपयोग करके पारित कर सकते हैं। यदि उपयोगकर्ता के पास निर्देशिका नहीं है, जिसमें nodeकमांड है $PATH, या कुछ अलग कमांड है node, तो यह गलत कमांड को लागू कर सकता है या बिल्कुल भी काम नहीं कर सकता है।
अन्य दृष्टिकोण हैं:
- एक
#!लाइन का उपयोग करें जो nodeकमांड के लिए पूर्ण पथ को निर्दिष्ट करता है, स्क्रिप्ट को विभिन्न प्रणालियों के लिए आवश्यकतानुसार अपडेट करता है; या
- आह्वान
nodeएक तर्क के रूप अपनी स्क्रिप्ट वाली आदेश।
चाल की अधिक चर्चा के लिए यह प्रश्न (और मेरा उत्तर ) भी देखें #!/usr/bin/env।
संयोग से, मेरे सिस्टम (लिनक्स मिंट 17.2) पर, यह स्थापित है /usr/bin/nodejs। मेरे नोट के अनुसार, यह से बदल /usr/bin/nodeकरने के लिए /usr/bin/nodejsUbuntu 12.04 और 12.10 के बीच। #!/usr/bin/envजब तक आप एक सिमलिंक या कुछ इसी तरह की स्थापना नहीं करते हैं , तो ट्रिक इसकी मदद नहीं करेगी।
अद्यतन: mtraceur द्वारा एक टिप्पणी कहती है (सुधारित):
नोडज बनाम नोड समस्या के लिए एक वर्कअराउंड फ़ाइल को निम्नलिखित छह लाइनों के साथ शुरू करना है:
#!/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के बाद से मैं पहली बार इस उत्तर पोस्ट मुद्दा वर्षों में हल किया गया है। उबंटू 18.04 पर, nodejsपैकेज सिमिलिंक के /usr/bin/nodejsरूप में स्थापित होता है /usr/bin/node। कुछ पहले के ओएस (उबंटू या लिनक्स मिंट, मुझे यकीन नहीं है कि कौन सा है), एक ऐसा nodejs-legacyपैकेज था nodeजो सिम्लिंक के रूप में प्रदान किया गया था nodejs। कोई गारंटी नहीं है कि मेरे पास सभी विवरण सही हैं।
node