দোভাষী দ্বারা সম্পাদিত হওয়া যে স্ক্রিপ্টগুলি সাধারণত ওএসকে কার্যকর করতে হয় তা জানানোর জন্য শীর্ষে একটি শেবাং লাইন থাকে।
আপনার যদি কোনও স্ক্রিপ্ট থাকে 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কমান্ড আরেকটি কমান্ড যার নাম তার কমান্ড লাইন দেওয়া হয় executes, যে কমান্ড কোনো নিম্নলিখিত আর্গুমেন্ট ক্ষণস্থায়ী। এটি এখানে ব্যবহার করার কারণ হ'ল কমান্ডটি envঅনুসন্ধান করবে $PATH। তাই আপনি যদি nodeইনস্টল করা হয় /usr/local/bin/node, এবং আপনি /usr/local/binআপনার $PATH,env কমান্ডটি অনুরোধ করা হবে /usr/local/bin/node foo।
এর মূল উদ্দেশ্য envকমান্ডটি চালানোর আগে নির্দিষ্ট পরিবেশের ভেরিয়েবল যুক্ত করা বা অপসারণ করে পরিবর্তিত পরিবেশ সহ অন্য কমান্ড চালানো হ'ল কমান্ডের । তবে কোনও অতিরিক্ত যুক্তি ছাড়াই, এটি কেবল অপরিবর্তিত পরিবেশের সাথে কমান্ডটি কার্যকর করে, যা এই ক্ষেত্রে আপনার প্রয়োজন কেবল।
এই পদ্ধতির কিছু ত্রুটি রয়েছে। বেশিরভাগ আধুনিক ইউনিক্স-মতো সিস্টেম রয়েছে /usr/bin/envতবে আমি পুরানো সিস্টেমগুলিতে কাজ করেছি যেখানে envকমান্ডটি একটি ভিন্ন ডিরেক্টরিতে ইনস্টল করা হয়েছিল। এই তত্ত্বটি ব্যবহার করে আপনি অতিরিক্ত যুক্তিগুলি সীমাবদ্ধ করতে পারেন pass ব্যবহারকারীর যদিnode কমান্ডটি অন্তর্ভুক্ত ডিরেক্টরিটি না রাখে$PATH বা তার কাছে কিছু আলাদা কমান্ড কল করা থাকে node, তবে এটি ভুল কমান্ডটি ডেকে আনতে পারে বা এগুলি কাজ করে না।
অন্যান্য পদ্ধতিগুলি হ'ল:
- কমান্ডের
#!সম্পূর্ণ পথ নির্দিষ্ট করে এমন একটি লাইন ব্যবহার করুন node, বিভিন্ন সিস্টেমের জন্য প্রয়োজনীয় স্ক্রিপ্টটি আপডেট করে; অথবা
nodeআর্গুমেন্ট হিসাবে আপনার স্ক্রিপ্টের সাথে আদেশটি আহ্বান করুন ।
কৌশল সম্পর্কে আরও আলোচনার জন্য এই প্রশ্নটি (এবং আমার উত্তর ) দেখুন #!/usr/bin/env।
উল্লেখ্য, আমার সিস্টেম (লিনাক্সের মিন্ট 17.2), এটি যেমন ইনস্টল /usr/bin/nodejs। আমার নোট অনুযায়ী থেকে পরিবর্তিত /usr/bin/nodeকরা /usr/bin/nodejsউবুন্টু 12.04 এবং 12.10 মধ্যে। #!/usr/bin/envকৌতুক দিয়ে সাহায্য করবে না (যদি না আপনি একটি সিমবলিক লিঙ্ক বা কিছু অনুরূপ সেট আপ)।
আপডেট: এমট্রেসিয়রের একটি মন্তব্য বলেছেন (পুনরায় ফর্ম্যাট করা):
নোডেজ বনাম নোড সমস্যার জন্য একটি কার্যনির্বাহীকরণটি নিম্নলিখিত ছয়টি লাইন দিয়ে ফাইলটি শুরু করা:
#!/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ভার্সেস nodeইস্যুটি সমাধান হয়ে গেছে। উবুন্টু 18.04-এ, nodejsপ্যাকেজটি এতে /usr/bin/nodejsএকটি সিমিলিংক হিসাবে ইনস্টল করে /usr/bin/node। পূর্ববর্তী কয়েকটি ওএসে (উবুন্টু বা লিনাক্স মিন্ট, আমি নিশ্চিত না কোনটি), সেখানে একটি nodejs-legacyপ্যাকেজ ছিল যা nodeসিমলিংক হিসাবে সরবরাহ করেছিল nodejs। আমার কাছে সমস্ত বিবরণ সঠিক আছে এমন কোনও গ্যারান্টি নেই।
node