নোড.জেএস স্ক্রিপ্টগুলির জন্য উপযুক্ত হ্যাশবাং


95

আমি নোড.জেএস এর জন্য একটি স্ক্রিপ্ট তৈরি করার চেষ্টা করছি যা একাধিক পরিবেশে কাজ করবে। বিশেষত আমার জন্য, আমি ওএস এক্স এবং উবুন্টুর মধ্যে পিছনে পিছনে স্যুইচ করছি। পূর্ববর্তী সময়ে, নোড হিসাবে ইনস্টল করা হয় node, তবে পরবর্তীকালে এটি হয় nodejs। আমার স্ক্রিপ্টের শীর্ষে, আমি থাকতে পারি:

#!/usr/bin/env node

বা

#!/usr/bin/env nodejs

আমি বরং স্ক্রিপ্টটি উভয় পরিবেশের জন্য এক্সিকিউটেবল হিসাবে চালিত করব যতক্ষণ না নোড ইনস্টল করা না হয়ে একটি বা ./script-name.jsঅন্যটির কমান্ড ( বনাম node script-name.js) নির্দিষ্ট করতে হবে ।

ব্যাকআপ হ্যাশবাং বা নোড.জেএস এর ক্ষেত্রে উভয় ক্ষেত্রে সামঞ্জস্যপূর্ণ কোনও নির্দিষ্ট করার কোনও উপায় আছে কি?


আপনি আপনার স্ক্রিপ্টকে কল করতে একটি মোড়কের শেল স্ক্রিপ্ট তৈরি করতে পারেন, এটি নোড কোথায় থাকে এবং এটি কী বলা হয় তা অনুসন্ধান করার চেষ্টা করে।
দুন

4
ইউনিক্স সাইটে এই উত্তরে প্রচুর পরামর্শ - unix.stackexchange.com/questions/65235/…
সরগ্যান্ট

আমার একটি নোডেজ স্ক্রিপ্ট রয়েছে যা আমি উবুন্টু থেকে 12.04 থেকে 12.10 এ আপগ্রেড #!/usr/bin/nodeকরার #!/usr/bin/nodejsসময় পরিবর্তিত হয়েছিল। এবং এটি এমন একটি মোড়ক থেকে নেওয়া হয়েছে যা উভয়ের জন্য পরীক্ষা করে। #!/usr/bin/envহ্যাক আলোচনার জন্য , এই প্রশ্ন এবং আমার উত্তর দেখুন
কিথ থমসন

"হ্যাশবাং ব্যাকরণ" নামক স্টেজ 3-তে টিসি 39
M. Twarog

উত্তর:


151

যদি আপনার স্ক্রিপ্টটি নোড বিকাশকারীদের ব্যবহারের উদ্দেশ্যে করা হয় তবে আপনার অবশ্যই একেবারে ব্যবহার করা উচিত

#!/usr/bin/env node

এবং কেবলমাত্র নোড হিসাবে ইনস্টল থাকা ব্যক্তিদের সাথে সামঞ্জস্যের চেষ্টা করার বিরক্ত করবেন না nodejs

যুক্তি:

  • শীতল বাচ্চারা এটিই করছে এবং আপনি যদি এটিও না করেন তবে আপনি শীতল নন। মত মেজর নোড প্রকল্প jshint , কর্মফল , আবাস , এবং এমনকি npm কেবল ব্যবহার #!/usr/bin/env nodeতাদের এক্সিকিউটেবল স্ক্রিপ্টের জন্য কুঁড়েঘর হিসাবে।
  • শীতল বাচ্চারা এটি করছে বলে, উবুন্টুতে নোডের সাথে যে কেউ কাজ করে সে এর জন্য /usr/bin/nodeএকটি সিমিলিংক সেট আপ করেছে nodejs। স্ট্যাক ওভারফ্লোতে এবং সমস্ত ওয়েব জুড়ে এখানে এটি করার জন্য সর্বাধিক দেখা নির্দেশাবলী রয়েছে। এমনকি nodejs-legacyপ্যাকেজটি ছিল যার পুরো উদ্দেশ্যটি ছিল আপনার জন্য এই সিমলিংক তৈরি করা। যে সকল ব্যক্তি নোড কীভাবে ব্যবহার করে থাকি উবুন্টু এই সমস্যাটি সমাধানের জন্য জানি, আর তারা আছে যদি তারা প্রায় কাছাকাছি কি কখনো নোড লেখা কোন সফটওয়্যার ব্যবহার করতে চান।
  • উবুন্টু 14.04 এ সমস্যাটির আর কোনও অস্তিত্ব মনে হয় না; আমি সবেমাত্র নোডকে শুদ্ধ করে একটি চালিয়েছি apt-get install nodejsএবং এটিতে /usr/bin/nodeএকটি সিমিলিংক হিসাবে তৈরি হয়েছিল /etc/alternatives/node। আমি সন্দেহ করি যে এই সমস্যা দ্বারা ক্ষতিগ্রস্থ লোকেরা সংকুচিত সংখ্যালঘু।

এমনকি আপনি যদি নোড-নিরক্ষর লোকদের টার্গেট করছেন, আপনি এখনও এটি ব্যবহার করতে চাইতে পারেন #!/usr/bin/env node, সম্ভবত nodejs-legacyযদি প্রয়োজন মনে করেন তবে আপনার ইনস্টলেশন ডকুমেন্টেশনে ম্যানুয়াল সিমলিংক তৈরি বা প্যাকেজ ইনস্টলের প্রয়োজনীয় সম্ভাবনা যুক্ত করতে পারেন। মনে রাখবেন যে উপস্থিত কেউ nodejsনা nodeথাকলেও উপরের শেবাং দিয়ে আপনার প্রোগ্রামটি চালানোর চেষ্টা করে, তারা দেখতে পাবেন:

/ usr / bin / env: node: এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই

এবং গুগলিং যা তাদের প্রথম ফলাফল এবং প্রথম পৃষ্ঠায় বহুবার এটিকে ঠিক করবে।

আপনি যদি সত্যই এটি নিশ্চিত করতে চান যে ব্যবহারকারী আপনার সফ্টওয়্যারটি এমন কোনও সিস্টেমে চালিত করতে পারেন যেখানে nodejsউপলভ্য আছে তবে nodeএটি নেই (বা nodeবাস্তবে অপেশাদার প্যাকেট রেডিও নোড প্রোগ্রামটি কোথায় ) তবে আপনি নেওয়া "দ্বি-লাইনের শেবাং" ব্যবহার করতে পারেন থেকে ইউনিক্স ও লিনাক্স স্ট্যাক এক্সচেঞ্জ :

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

console.log('Hello world!');

নোড বিশ্বের প্রায় কেউই নেই, তবে আপনার কি সত্যিই এটি করা দরকার?


4
যদি nodejsএক্সিকিউটেবলের পক্ষে সমর্থনকে অগ্রাধিকার দেওয়া হয় তবে আপনি #!/bin/shএবং এর সাথে একটি শেবাং ব্যবহার করা সামান্য সুন্দর দেখতে পাবেন //bin/false || exec "$(command -v nodejs || command -v node)" "$0"
লেনারটক্লি

4
মনে রাখবেন আপনি লিনাক্সে নোড দেওয়ার জন্য আর্গুমেন্টগুলি পাস করতে পারবেন না , যেমন --experimental-modulesআপনি যদি এই envশেবাং লাইনটি ব্যবহার করেন । চারপাশে হ্যাকস রয়েছে তবে তারা কুরুচিপূর্ণ
ড্যান ড্যাসক্লেস্কু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.