কোন সমস্যা / প্যাটার্ন কমান্ড প্রতিস্থাপন ব্যবহার ন্যায্যতা দেয়?


2

ডিজিটালওশন এর মত হোস্টিং সরবরাহকারী "স্ব পরিচালিত শেল" তে আমি উবুন্টু এবং বাশের সাথে কয়েকটি সার্ভার পরিবেশ উত্থাপন করেছি, যার উপরে আমি দ্রুপাল / ওয়ার্ডপ্রেস অ্যাপ্লিকেশন চালিয়েছি।

" কমান্ড সাবস্টিটিশন " নামে পরিচিত এমনটি ব্যবহার করার জন্য আমার সমস্ত সময় প্রয়োজন ছিল না ।

আমি জিজ্ঞাসা করব, কোন সমস্যা হবে, এমন একটি "প্যাটার্ন" যাতে কোনও বাশ প্রোগ্রামারকে এই ধারণাটি ব্যবহার করতে হবে? দয়া করে একটি উদাহরণ দিন?

উত্তর:


3

আমি এটি findপ্রচুর সাথে ব্যবহার করি যেমন:

tar cvf ../junk.tar `find .`

এছাড়াও, দরিদ্র-লোকের আইডিইর অংশ হিসাবে:

vi `grep mysearcstring *.[ch]`

উপরোক্ত কমান্ড-লাইন উদাহরণ। আমি এটি প্রচুর স্ক্রিপ্টগুলিতেও ব্যবহার করি এবং এটি ছাড়া কঠোর চাপ দেওয়া হবে sed কমান্ডের আউটপুট থেকে শেল ভেরিয়েবল সেট করার জন্য সম্ভবত উপরে বর্ণিত সর্বাধিক সাধারণ কেসটি রয়েছে:

NOW=`date`

আমি পুরানো অভ্যাস অনুসারে ব্যাক-কোট ব্যবহার করি তবে $(command)সিনট্যাক্সটি আরও ভাল কারণ আপনি একে অপরের মধ্যে এম্বেড করতে পারেন। ব্যাক-কোটসের সাহায্যে আপনাকে জানতে হবে কোথায় পালানো \অক্ষর রাখা উচিত এবং এটি একটি উপদ্রব।


6

কমান্ড প্রতিস্থাপনের অর্থ শেল কমান্ড চালানো এবং তার আউটপুটটি একটি ভেরিয়েবলের মধ্যে সঞ্চয় করা বা ইকো কমান্ড ব্যবহার করে ফিরে প্রদর্শন করা। উদাহরণস্বরূপ, তারিখ এবং সময় প্রদর্শনের:

echo "Today is $(date)"

এটি এমন পরিস্থিতিতে কার্যকর যেখানে আমার কমান্ড প্যারামিটার হিসাবে অন্য আদেশ বা উদাহরণের আউটপুট হিসাবে গ্রহণ করে।


2
এটি একটি দুর্ভাগ্যজনক উদাহরণ dateযা একই জিনিসটি একই সাথে করতে পারে date +'Today is %a %b %e %H:%M:%S %Z %Y'এবং কারণ ভেরিয়েবল ডেটা আউটপুট দেওয়ার সময় printfতার চেয়ে বেশি ভাল echo
কুসালানন্দ

এছাড়াও, date | sed 's/^/Today is /'... ব্যবহার করে ডেটা প্রদর্শন করতে একটি কমান্ড বিকল্প ব্যবহার করা কমান্ড বিকল্পের ব্যবহারের echoকোনও ভাল বা এমনকি মূ .় উদাহরণ নয়।
কুসালানন্দ

vfbsilva আপনি মুদ্রণ ব্যবহারের জন্য উদাহরণটি পরিবর্তন করতে চান এবং তারিখটি ব্যবহার করবেন না?
ব্যবহারকারী 9303970

আমি সম্ভবত সমস্যাটি অন্যরকম প্রশ্নের উত্তর দিই than আপনি পরবর্তী উত্তরটি গ্রহণ করতে পারেন আমি কম পয়েন্টটি বিবেচনা করতে পারছি না আমি সেরা অনুশীলনগুলি নিয়ে আলোচনা করার জন্য এখানে নই আমি কেবল একটি ধারণা দেখছিলাম যা এই কোডটি গল্ফিং হয়ে যাওয়ার চেয়ে
ইমো

4

থেকে POSIX মান মধ্যে কমান্ড উপকল্পন উপধারা :

কমান্ড প্রতিস্থাপন কমান্ডের নামের পরিবর্তে একটি কমান্ডের আউটপুট প্রতিস্থাপন করতে দেয়।

কমান্ডের বিকল্পগুলি কমান্ডের আউটপুটটি অস্থায়ী ফাইলটিতে প্রথমে লেখার প্রয়োজন ছাড়াই এবং তারপরে সেই ফাইলটি থেকে পড়ার প্রয়োজন ছাড়াই ব্যবহার করার সহজ উপায়ের অনুমতি দেয়। কমান্ডের আউটপুট একটি এক লাইনের একটি সংক্ষিপ্ত স্ট্রিং হলে এটি করা ভাল।

কিছু লোক কমান্ড থেকে আউটপুট সংগ্রহ করতে কমান্ড বিকল্প ব্যবহার করে এমনকি আউটপুটের পরিমাণটি বহু-লাইন ডকুমেন্ট হতে পারে। কমান্ড সাবস্টিটিউশন ব্যবহার করার জন্য এটি সাধারণত একটি ভাল উপায় নয় । পরিবর্তে, পাইপলাইনগুলি বা অস্থায়ী ফাইলগুলি ব্যবহার করে প্রক্রিয়াজাতকরণের মধ্যবর্তী ডেটা পাস করার স্ট্যান্ডার্ড ইউনিক্স আইডিয়ামটি ব্যবহার করা উচিত।


কমান্ড বিকল্পের উদাহরণ যা আমি ব্যবহার করি:

উদাহরণস্বরূপ, বর্তমান ব্যবহারকারী স্ক্রিপ্টটি মূল হিসাবে চালাচ্ছেন কিনা তা নির্ধারণ করার জন্য:

if [ "$( id -u )" -ne 0 ]; then
   echo 'This script requires root privileges, re-run with sudo' >&2
   exit 1
fi

$(id -u)কমান্ড প্রতিকল্পন আউটপুট দ্বারা প্রতিস্থাপিত হবে id -u, যা বর্তমান ব্যবহারকারীর ইউআইডি (একটি পূর্ণসংখ্যা) ফিরে আসবে।

আরেকটি উদাহরণ. আমি কমিটস সাইন করতে GnuPG ব্যবহার করছি git। GnuPG সঠিকভাবে কাজ করার GPG_TTYজন্য, আমার ইন্টারেক্টিভ শেলের প্রারম্ভিককরণ ফাইলটিতে আমার বর্তমান টার্মিনাল ডিভাইসের নাম সেট করা দরকার । আমি এটা দিয়ে করি

export GPG_TTY="$( tty )"

এটি শেল সেশনে বর্তমান টার্মিনাল ডিভাইসটির উপর নির্ভর করে GPG_TTYএমন কিছু সেট করে /dev/ttyp4

আরেকটি উদাহরণ. আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা সোলারিস মেশিনে একটি বিশেষ কেস হিসাবে চলমান আচরণ করতে হবে:

case "$( uname -s )" in
    SunOS)
        # code specific for Solaris
        ;;
    *)
        # code for all other Unix platforms
esac

আরেকটি উদাহরণ. getconf PATHকমান্ড বর্তমান সিস্টেমের জন্য "ডিফল্ট পথ" ফেরৎ। আমি কিছু পরিস্থিতিতে PATHভেরিয়েবলটিকে "বুদ্ধিমান ডিফল্ট" মানটিতে পুনরায় সেট করতে ব্যবহার করি :

PATH="$( getconf PATH )"

2

আরেকটি উদাহরণ:

  • ডকারে আপনি ব্যবহার করে থামানো পাত্রে পরিষ্কার করতে পারেন:

    docker rm containerID containerID containerID ...`
    
  • আপনি যে পাত্রে চালানো বন্ধ করেছেন সেগুলির আইডিগুলিও পেতে পারেন:

    docker ps -q -f "status=exited" 
    
  • সুতরাং আপনি এর মাধ্যমে সমস্ত বন্ধ হওয়া পাত্রে পরিষ্কার করতে পারেন:

    docker rm $(docker ps -q -f "status=exited")
    

... যেখানে উত্পাদিত আইডিগুলি কমান্ড দ্বারা ব্যবহৃত স্ট্রিংয়ের docker psপরিবর্তে হয় ।$(docker ps...)docker rm


2

এই প্রয়োগটি প্রয়োজনীয় করে তোলে এমন বাস্তবায়ন প্যাটার্নটি হ'ল ইউনিক্স শেলগুলি শিশু প্রক্রিয়ায় প্রতিটি অ-বিল্টিন কমান্ড কার্যকর করে। শিশু প্রক্রিয়াটি তার পিতামাতার প্রসঙ্গে পরিবর্তন করতে পারে না। কমান্ড প্রতিস্থাপনের ফলে শেলটি একটি বিল্টিন অন্তর্নিহিত কমান্ডের পাঠ্য আউটপুট ব্যবহার করতে পারে যেমন শেল স্ক্রিপ্টে লেখা হয়েছে বা কমান্ড লাইনে টাইপ করা হয়েছে।

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