এই ফর্মটি পরিবর্তনশীল = = $ (…)


9

নিম্নলিখিতটির অর্থ কী:

basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")

আমি এই অংশে আগ্রহী:

varible=$(...)

আমি জানি যে প্যারেন্সেসিস সাব-প্রসেসটি চালাতে ব্যবহৃত হয়, তবে সেগুলি যদি পাশাপাশি ব্যবহার করা হয় তবে কী হবে $?


3
আপনি যদি ব্যাশ ব্যবহার করছেন: ম্যান-পৃষ্ঠার মাধ্যমে man bashসন্ধান করুন এবং কমান্ড প্রতিস্থাপনের জন্য অনুসন্ধান করুন
ফ্লোহই

উত্তর:


16

বাশ ম্যানুয়াল থেকে ( 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 বা তার আগের মত) সমর্থন করে নি $(...)
স্টাফেন চেজেলাস 22'17

@ স্টাফেনচাজেলাস আমি এটি অন্তর্ভুক্ত করব।
কুসালানন্দ

6

এটা তোলে মানে চালানো কি ভিতরে প্রথম বন্ধনী মধ্যে subshell এবং আসতে যে একটি হিসাবে মান , বরাদ্দ আপনার ক্ষেত্রে যে varible


5

varible=$(..)নামক কমান্ড প্রতিকল্পন এবং এটি এর মানে বেশিও কিন্তু শেল কমান্ড চালানো এবং একটি পরিবর্তনশীল তার আউটপুট সঞ্চয় করে না বা প্রতিধ্বনি কমান্ড ব্যবহার করে ফিরে প্রদর্শন করে। উদাহরণস্বরূপ, প্রদর্শনের তারিখ এবং সময়:

echo "Today is $(date)"

এবং এটি একটি চলকতে সঞ্চয় করার জন্য:

SERVERNAME=$(hostname)

আরও তথ্যের জন্য: https://www.cyberciti.biz/faq/unix-linux-bsd-appleosx-bash-assign-variable-command-output/

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.