Node.js लिपियों के लिए उपयुक्त हैशबैंग


94

मैं नोड के लिए एक स्क्रिप्ट बनाने की कोशिश कर रहा हूं। जेएस जो कई वातावरणों में काम करेगा। विशेष रूप से मेरे लिए, मैं ओएस एक्स और उबंटू के बीच आगे और पीछे स्विच कर रहा हूं। पूर्व में, नोड के रूप में स्थापित किया गया है node, लेकिन बाद में यह है nodejs। मेरी स्क्रिप्ट के शीर्ष पर, मैं कर सकता हूं:

#!/usr/bin/env node

या

#!/usr/bin/env nodejs

मेरे पास स्क्रिप्ट को या तो पर्यावरण के लिए एक निष्पादन योग्य के रूप में चलाया जाता है जब तक कि नोड स्थापित नहीं होता है जब तक कि एक या दूसरे को कमांड निर्दिष्ट करना पड़ता है ( ./script-name.jsबनाम node script-name.js)।

क्या कोई बैकअप हैशबैंग या एक निर्दिष्ट करने का कोई तरीका है जो नोड.जेएस के लिए किसी भी मामले में संगत है?


आप अपनी स्क्रिप्ट को कॉल करने के लिए एक आवरण खोल स्क्रिप्ट बना सकते हैं, जो यह पता लगाने की कोशिश करता है कि नोड कहाँ रहता है और इसे क्या कहा जाता है।
दून

4
यूनिक्स साइट पर इस जवाब में बहुत सारे सुझाव - unix.stackexchange.com/questions/65235/…
१५

मैं एक NodeJS स्क्रिप्ट है कि मैं से बदल दिया है #!/usr/bin/nodeकरने के लिए #!/usr/bin/nodejsजब मैं Ubuntu 12.04 से 12.10 करने के लिए उन्नत। और यह एक रैपर से मंगवाया गया है जो दोनों के लिए जाँच करता है। #!/usr/bin/envहैक की चर्चा के लिए , इस प्रश्न और मेरे उत्तर को देखें
कीथ थॉम्पसन

स्टेज 3 में "हैशबैंग ग्रामर" नामक टीसी 3 का प्रस्ताव है, जिसका उद्देश्य इस्तेमाल किए गए हैशबैंग्स को खड़ा करना है: github.com/tc39/proposal-hashbang
M. Twarog

जवाबों:


150

यदि आपकी स्क्रिप्ट नोड डेवलपर्स द्वारा उपयोग के लिए अभिप्रेत है, तो आपको पूरी तरह से उपयोग करना चाहिए

#!/usr/bin/env node

और उन लोगों के साथ संगतता के लिए प्रयास करने से परेशान न हों, जिनके पास केवल Node स्थापित है nodejs

दलील:

  • यह शांत बच्चे कर रहे हैं, और यदि आप ऐसा नहीं करते हैं, तो आप शांत नहीं हैं। जैश , कर्म , बोवर और यहां तक ​​कि एनपीएम जैसी प्रमुख नोड परियोजनाएं केवल #!/usr/bin/env nodeउनके निष्पादन योग्य लिपियों के लिए शेबंग के रूप में उपयोग करती हैं।
  • क्योंकि शांत बच्चे यह कर रहे हैं, जो कोई भी उबंटू पर नोड के साथ काम करता है उसने /usr/bin/nodeएक सिम्लिंक के रूप में स्थापित किया है nodejs। स्टैक ओवरफ्लो, और पूरे वेब पर यहां ऐसा करने के लिए अत्यधिक-निर्देश दिए गए हैं। यहां तक ​​कि वह nodejs-legacyपैकेज भी था जिसका पूरा उद्देश्य आपके लिए यह सिमलिंक बनाना था। जो लोग नोड का उपयोग कैसे Ubuntu पर इस समस्या को दूर करने के लिए पता है, और वे के लिए अगर वे काफी कभी नोड में लिखा किसी भी सॉफ्टवेयर का उपयोग करना चाहते हैं।
  • समस्या भी Ubuntu 14.04 पर किसी भी अधिक मौजूद नहीं है; मैं सिर्फ नोड शुद्ध और एक भाग गया apt-get install nodejsऔर यह /usr/bin/nodeकरने के लिए एक सहानुभूति के रूप में बनाया /etc/alternatives/node। इस मुद्दे से पीड़ित लोग हैं, मुझे संदेह है, एक छोटा अल्पसंख्यक।

यहां तक ​​कि अगर आप नोड-अनपढ़ लोगों को लक्षित कर रहे हैं, तो भी आप उपयोग करना चाह सकते हैं, हो सकता है कि #!/usr/bin/env nodeमैनुअल सीलिंक निर्माण या nodejs-legacyपैकेज की स्थापना के लिए संभावित आवश्यकता को जोड़कर यदि आप इसे आवश्यक समझें। ध्यान दें कि यदि कोई उपलब्ध nodejsनहीं है, लेकिन nodeउपलब्ध कार्यक्रम को उपरोक्त शेबंग के साथ चलाने की कोशिश करता है, तो वे देखेंगे:

/ usr / bin / env: नोड: ऐसी कोई फ़ाइल या निर्देशिका नहीं है

और Googling जो उन्हें पहले परिणाम में और पहले पृष्ठ पर कई बार तय करेगा।

यदि आप वास्तव में, यह सुनिश्चित करना चाहते हैं कि उपयोगकर्ता आपके सॉफ़्टवेयर को एक सिस्टम पर चला सकता है, जहां nodejsउपलब्ध है, लेकिन nodeऐसा नहीं है (या जहां nodeवास्तव में एमेच्योर पैकेट रेडियो नोड प्रोग्राम है ), तो आप इस "टू-लाइन शबंग" का उपयोग कर सकते हैं। से यूनिक्स और लिनक्स स्टैक एक्सचेंज :

#!/bin/sh
':' //; exec "$(command -v nodejs || command -v node)" "$0" "$@"

console.log('Hello world!');

लेकिन क्या आपको वास्तव में ऐसा करने की आवश्यकता है जब नोड दुनिया में कोई और नहीं है?


2
यदि nodejsनिष्पादन योग्य के लिए समर्थन पसंद किया जाता है, तो आपको शेबंग के साथ #!/bin/shऔर इसका उपयोग करने के लिए थोड़ा प्रेटियर मिल सकता है //bin/false || exec "$(command -v nodejs || command -v node)" "$0"
लेनार्टक्ले

2
ध्यान दें कि आप लिनक्स पर नोड के लिए तर्कों को पारित नहीं कर सकते हैं , जैसे कि --experimental-modules, यदि आप इस envशेलंग लाइन का उपयोग करते हैं । वहाँ हैक कर रहे हैं, लेकिन वे बदसूरत हैं
डेन डैस्कलेस्क्यू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.