নিম্নলিখিতটির অর্থ কী:
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
আমি এই অংশে আগ্রহী:
varible=$(...)
আমি জানি যে প্যারেন্সেসিস সাব-প্রসেসটি চালাতে ব্যবহৃত হয়, তবে সেগুলি যদি পাশাপাশি ব্যবহার করা হয় তবে কী হবে $?
নিম্নলিখিতটির অর্থ কী:
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
আমি এই অংশে আগ্রহী:
varible=$(...)
আমি জানি যে প্যারেন্সেসিস সাব-প্রসেসটি চালাতে ব্যবহৃত হয়, তবে সেগুলি যদি পাশাপাশি ব্যবহার করা হয় তবে কী হবে $?
উত্তর:
বাশ ম্যানুয়াল থেকে ( man bash):
কমান্ড সাবস্টিটিউশন
কমান্ড প্রতিস্থাপন একটি কমান্ডের আউটপুটটিকে প্রতিস্থাপন করতে দেয়
কমান্ড নাম। দুটি রূপ রয়েছে:
$ (কমান্ড)
অথবা
`command`
বাশ একটি সাব শীলে কমান্ড প্রয়োগ করে সম্প্রসারণ সম্পাদন করে
পরিবেশ এবং কমান্ড বিকল্পটি স্ট্যান্ডার্ডের সাথে প্রতিস্থাপন করা
কমান্ডের আউটপুট, কোনও পেছনের নতুন লাইনগুলি মুছে ফেলা হয়েছে। এমবেডেড
নিউলাইনগুলি মুছে ফেলা হয় না তবে শব্দের সময় সেগুলি মুছে ফেলা হতে পারে
বিভাজন। কমান্ড প্রতিস্থাপন cat (বিড়াল ফাইল) দ্বারা প্রতিস্থাপন করা যেতে পারে
সমতুল্য কিন্তু দ্রুত $ (<ফাইল)।
(এই জন্য কথা সত্য সব বোর্ন মত শাঁস, অর্থাত্ sh, ksh, zsh, bashইত্যাদি, এবং zshএই ভাবে এমবেড NUL অক্ষর ক্যাপচার ডাটা করতে সক্ষম হয়)
আদেশ
basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
স্ক্রিপ্টটি অবস্থিত সেই ডিরেক্টরিটির নাম (সমস্ত ব্যাকস্ল্যাশগুলি ফরোয়ার্ড স্ল্যাশে রূপান্তর করার সময়) ভেরিয়েবলের জন্য বরাদ্দ করবে basedir। স্ট্যান্ডার্ড ত্রুটি প্রবাহে $(...)আউটপুট করা কোনও ত্রুটি, সতর্কতা বা অন্যান্য ডায়াগনস্টিক বার্তাগুলি এখনও টার্মিনালে প্রদর্শিত হবে ( কেবলমাত্র আদেশের স্ট্যান্ডার্ড আউটপুট ধারণ করে)।
শেলটি অন্তঃস্থতম কমান্ড প্রতিস্থাপন সম্পাদন করে শুরু হবে:
echo "$0" | sed -e 's,\\,/,g'
এর আউটপুটটি স্ট্রিং হিসাবে দেওয়া হবে dirnameএবং এর আউটপুটটি ভেরিয়েবলের জন্য বরাদ্দ করা হবে basedir।
ডাবল কোটগুলি রয়েছে তা নিশ্চিত করার জন্য যে কোনও শব্দ-বিভক্তকরণ বা ফাইলের নাম গ্লোববিং করা হবে না, অন্যথায় আপনি দেখতে পাবেন যে স্ক্রিপ্টটি ব্যর্থ হবে বা অদ্ভুত আউটপুট উত্পন্ন করবে যখন $0(স্ক্রিপ্টটির নাম এটি চালানোর জন্য ব্যবহৃত পাথ সহ) একটি স্থান থাকে contains অক্ষর বা একটি ফাইলের নাম গ্লোব্বিং অক্ষর (যেমন ?বা *)।
সর্বদা বিস্তৃতি (পরিবর্তনশীল বিস্তৃতি, কমান্ড প্রতিস্থাপন এবং পাটিগণিতের বিস্তৃতি) উদ্ধৃত করা একটি ভাল ধারণা। কেন এটি একটি ভাল ধারণা এটির জন্য একটি দুর্দান্ত ব্যাখ্যার জন্য এই প্রশ্ন এবং এর উত্তরগুলি দেখুন ।
স্ক্রিপ্ট হিসাবে হিসাবে কার্যকর করা হয়েছে
$ /usr/local/bin/script.sh
তাহলে basedirএর মান পাবে /usr/local/bin।
বা, সাইগউইনে:
$ bash c:\\Users\\Me\\script.sh
তাহলে basedirএর মান পাবে c:/Users/Me। এক্ষেত্রে কমান্ড লাইনে ডাবল ব্যাকস্ল্যাশগুলি কেবল শেল থেকে একক ব্যাকস্ল্যাশ থেকে রক্ষা পাওয়া। প্রকৃত মান $0হল c:\Users\Me\script.sh।
ব্যবহার না করে একই জিনিস করার আর একটি উপায় dirname, echoএবং sedহবে
basedir="${0//\\//}"
basedir="${basedir%/*}"
/bin/shসোলারিস 10 বা তার আগের মত) সমর্থন করে নি $(...)।
এটা তোলে মানে চালানো কি ভিতরে প্রথম বন্ধনী মধ্যে subshell এবং আসতে যে একটি হিসাবে মান , বরাদ্দ আপনার ক্ষেত্রে যে varible।
varible=$(..)নামক কমান্ড প্রতিকল্পন এবং এটি এর মানে বেশিও কিন্তু শেল কমান্ড চালানো এবং একটি পরিবর্তনশীল তার আউটপুট সঞ্চয় করে না বা প্রতিধ্বনি কমান্ড ব্যবহার করে ফিরে প্রদর্শন করে। উদাহরণস্বরূপ, প্রদর্শনের তারিখ এবং সময়:
echo "Today is $(date)"
এবং এটি একটি চলকতে সঞ্চয় করার জন্য:
SERVERNAME=$(hostname)
আরও তথ্যের জন্য: https://www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-assign-variable-command-output/
man bashসন্ধান করুন এবং কমান্ড প্রতিস্থাপনের জন্য অনুসন্ধান করুন