শেলের নিয়ন্ত্রণ এবং পুনঃনির্দেশ অপারেটরগুলি কী কী?


245

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

command1 |  command2
command1 &  command2
command1 || command2    
command1 && command2

অন্যরা মনে হয় ফাইলগুলিতে কমান্ডগুলি সংযুক্ত করছে:

command1  > file1
command1  >> file1

এ জিনিসগুলো কি? তাদেরকে কী বলে? তারা কি করে? তাদের আরও কি আছে?


এই প্রশ্নটি সম্পর্কে মেটা থ্রেড।

উত্তর:


340

এগুলিকে শেল অপারেটর বলা হয় এবং হ্যাঁ, তাদের আরও রয়েছে। আমি দুটি প্রধান শ্রেণীর মধ্যে কন্ট্রোল অপারেটর এবং পুনর্নির্দেশ অপারেটরগুলির মধ্যে এবং তারা কীভাবে বাশ শেলের প্রতি শ্রদ্ধা রেখে কাজ করে সেগুলির মধ্যে সবচেয়ে সাধারণের একটি সংক্ষিপ্ত বিবরণ দেব ।

উ: কন্ট্রোল অপারেটরগণ

শেল কমান্ড ভাষায়, একটি টোকেন যা একটি নিয়ন্ত্রণ ফাংশন সম্পাদন করে।
এটি নিম্নলিখিত চিহ্নগুলির মধ্যে একটি:

&   &&   (   )   ;   ;;   <newline>   |   ||

এবং |&বাশ মধ্যে।

একটি !হল না একটি নিয়ন্ত্রণ অপারেটর কিন্তু একটি সংরক্ষিত ওয়ার্ড । এটি গাণিতিক এক্সপ্রেশন এবং টেস্ট কনস্ট্রাক্টসের অভ্যন্তরে (এখনও একটি স্পেস ডিলিমিটারের প্রয়োজন হয়) লজিক্যাল নট [নেগেটিশন অপারেটর] হয়ে যায় ।

A.1 তালিকা টার্মিনেটর

  • ; : প্রথমটির ফলাফল নির্বিশেষে একের পর এক কমান্ড পরিচালিত হবে।

    command1 ; command2

    প্রথম command1চালানো হবে, অগ্রভাগে এবং একবার এটি শেষ হয়ে গেলে command2চালানো হবে।

    একটি নিউলাইন যা স্ট্রিং আক্ষরিক বা নির্দিষ্ট কীওয়ার্ডের পরে নেই সেমিকোলন অপারেটরের সমতুল্য নয় । একটি তালিকা ;সীমায়িত সহজ কমান্ড এখনও একটি হল তালিকা - শেল এর পার্সার হিসেবে এখনও সহজ কমান্ড একটি অনুসরণ পড়া চালিয়ে যেতে হবে ;বা তালিকা তালিকা -, চালানোর আগে সীমায়িত সহজ কমান্ড যেহেতু একটি newline একটি সম্পূর্ণ কমান্ড তালিকা সীমানা পারবেন না। পার্থক্যটি সূক্ষ্ম, তবে জটিল: শেলটি একটি নতুন লাইনের পরে ডেটা পড়ার জন্য পূর্বের অত্যাবশ্যকীয় না থাকলে, নিউলাইনটি এমন একটি বিন্দু চিহ্নিত করে যেখানে শেলটি ইতিমধ্যে পড়ে থাকা সাধারণ কমান্ডগুলির মূল্যায়ন করতে শুরু করতে পারে, যেখানে একটি ;আধা-কোলন রয়েছে না.

  • & : এটি পটভূমিতে একটি কমান্ড চালাবে, আপনাকে একই শেলটিতে কাজ চালিয়ে যাওয়ার অনুমতি দেয়।

     command1 & command2

    এখানে, command1ব্যাকগ্রাউন্ডে command2আরম্ভ করা হয় command1এবং প্রস্থানের জন্য অপেক্ষা না করে অবিলম্বে অগ্রভাগে চলতে শুরু করে ।

    এর পরে একটি নতুন লাইন optionচ্ছিক command1

A.2 লজিকাল অপারেটর

  • && : এবং তালিকা তৈরি করতে ব্যবহৃত হয়, এটি আপনাকে কেবলমাত্র একটি কমান্ড চালানোর অনুমতি দেয় যদি অন্য কোনও সফলভাবে উপস্থিত হয়।

     command1 && command2

    এখানে, command2পরে হবে চালানোর command1সমাপ্ত হয়েছে এবং শুধুমাত্র যদি command1সফল হয়েছে (যদি তার প্রস্থান কোড 0 ছিল)। উভয় কমান্ড অগ্রভাগে চালিত হয়।

    এই আদেশও লেখা যেতে পারে

    if command1
    then command2
    else false
    fi

    অথবা সহজভাবে if command1; then command2; fiযদি প্রত্যাবর্তনের স্থিতি উপেক্ষা করা হয়।

  • || : ওআর তালিকাগুলি তৈরি করতে ব্যবহৃত হয়, এটি আপনাকে কেবলমাত্র একটি কমান্ড চালানোর অনুমতি দেয় যদি অন্য কোনওটি ব্যর্থ হয়।

     command1 || command2

    এখানে, command2কেবলমাত্র command1ব্যর্থ হলে চালিত হবে (যদি এটি 0 ব্যতীত একটি প্রস্থান স্থিতি ফিরে আসে)। উভয় কমান্ড অগ্রভাগে চালিত হয়।

    এই আদেশও লেখা যেতে পারে

    if command1
    then true
    else command2
    fi

    বা খাটো ভাবে if ! command1; then command2; fi

    নোট করুন &&এবং ||বাম-সহযোগী হয়; দেখতে শেল লজিক্যাল অপারেটর && এর প্রাধান্য, || আরও তথ্যের জন্য.

  • !: এটি একটি সংরক্ষিত শব্দ যা "কমান্ড" অপারেটর হিসাবে কাজ করে (তবে অবশ্যই একটি ডিলিমিটার থাকতে হবে), এটি একটি কমান্ডের রিটার্নের স্ট্যাটাসটিকে অস্বীকার করার জন্য ব্যবহৃত হয়েছিল - কমান্ডটি যদি ননজারো স্থিতি ফিরিয়ে দেয় তবে 0 প্রদান করুন, যদি স্থিতি 0 ফেরত দেয় তবে 1 ফিরে আসুন এছাড়াও testইউটিলিটির জন্য একটি যৌক্তিক নয় NOT

    ! command1
    
    [ ! a = a ]

    এবং গাণিতিক এক্সপ্রেশনগুলির মধ্যে সত্যিকারের অপারেটর:

    $ echo $((!0)) $((!23))
    1 0

A.3 পাইপ অপারেটর

  • |: পাইপ অপারেটর, এটি অন্য কমান্ড হিসাবে একটি কমান্ডের আউটপুট পাস করে। পাইপ অপারেটর থেকে নির্মিত একটি কমান্ডকে পাইপলাইন বলা হয় ।

     command1 | command2

    দ্বারা মুদ্রিত যে কোনও আউটপুট command1ইনপুট হিসাবে পাস করা হয় command2

  • |&: এটি 2>&1 |ব্যাশ এবং zsh এর জন্য একটি শর্টহ্যান্ড । এটি অন্য কমান্ডের জন্য একটি আদেশের স্ট্যান্ডার্ড আউটপুট এবং স্ট্যান্ডার্ড ত্রুটি উভয়ই পাস করে।

    command1 |& command2

A.4 অন্যান্য তালিকার বিরামচিহ্ন

;;কেস স্টেটমেন্টের শেষ চিহ্নিত করতে একমাত্র ব্যবহৃত হয় । Ksh, ব্যাশ এবং zsh এছাড়াও সমর্থন ;&পরবর্তী ক্ষেত্রে মাধ্যমে পড়া এবং ;;&(এটিটি ksh নেই) উপর যান এবং পরবর্তী ক্ষেত্রে পরীক্ষা করা হবে।

(এবং গোষ্ঠী কমান্ডগুলি) ব্যবহার করতে এবং সেগুলি একটি সাব-শেলের মাধ্যমে লঞ্চ করতে ব্যবহৃত হয় । এবং গোষ্ঠী কমান্ডগুলিও দেয় তবে সেগুলি সাব-শেলের মাধ্যমে প্রবর্তন করবেন না। শেল সিনট্যাক্সে বিভিন্ন ধরণের বন্ধনী, বন্ধনী এবং বন্ধনীগুলির আলোচনার জন্য এই উত্তরটি দেখুন ।{}

বি পুনঃনির্দেশ অপারেটর

পুনর্নির্দেশ অপারেটর

শেল কমান্ড ভাষায়, একটি টোকেন যা পুনঃনির্দেশ ফাংশন সম্পাদন করে। এটি নিম্নলিখিত চিহ্নগুলির মধ্যে একটি:

<     >     >|     <<     >>     <&     >&     <<-     <>

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

  • < : একটি কমান্ড ইনপুট দেয়।

    command < file.txt

    উপরের commandবিষয়বস্তু উপর কার্যকর করা হবে file.txt

  • <>: উপরের মতই, তবে ফাইলটি কেবল পঠনের পরিবর্তে পঠন + রাইটিং মোডে খোলা আছে :

    command <> file.txt

    যদি ফাইলটি না থাকে তবে এটি তৈরি করা হবে।

    এই অপারেটরটি খুব কমই ব্যবহৃত হয় কারণ সাধারণত কমান্ডগুলি কেবল তাদের স্টিডিন থেকে পড়ে থাকে , যদিও এটি বেশ কয়েকটি নির্দিষ্ট পরিস্থিতিতে কার্যকর হতে পারে

  • > : একটি ফাইলের মধ্যে একটি কমান্ডের আউটপুট নির্দেশ করে।

    command > out.txt

    উপরের commandহিসাবে হিসাবে আউটপুট সংরক্ষণ করবে out.txt। যদি ফাইলটি বিদ্যমান থাকে তবে এর সামগ্রীগুলি ওভাররাইট করা হবে এবং এটি উপস্থিত না থাকলে এটি তৈরি করা হবে।

    এই অপারেটরটি প্রায়শই স্ট্যান্ডার্ড ত্রুটি বা স্ট্যান্ডার্ড আউটপুটে মুদ্রিত হওয়া উচিত কিনা তা চয়ন করতে ব্যবহৃত হয় :

    command >out.txt 2>error.txt

    উপরের উদাহরণে, >স্ট্যান্ডার্ড আউটপুট পুনর্নির্দেশ করবে এবং 2>স্ট্যান্ডার্ড ত্রুটি পুনর্নির্দেশ করবে । আউটপুট এছাড়াও ব্যবহার পুনঃনির্দেশিত করা যেতে পারে 1>কিন্তু, যেহেতু এই ডিফল্ট হয়, 1সাধারণত বাদ দেওয়া হয় এবং এটি কেবল হিসাবে লেখা >

    সুতরাং, চালানোর জন্য commandউপর file.txtএবং তার আউটপুট সংরক্ষণ out.txtএবং কোন ত্রুটি বার্তা error.txtআপনি চালাতে হবে:

    command < file.txt > out.txt 2> error.txt
  • >|: >শেলটি ওভাররাইটিং ( set -Cবা এর সাথে set -o noclobber) প্রত্যাখ্যান করার জন্য কনফিগার করা থাকলেও লক্ষ্যটি ওভাররাইট করে will

    command >| out.txt

    যদি out.txtবিদ্যমান থাকে তবে এর আউটপুট commandতার সামগ্রীটিকে প্রতিস্থাপন করবে। এটি উপস্থিত না থাকলে এটি তৈরি করা হবে।

  • >>: >লক্ষ্য ফাইলটি উপস্থিত থাকলে বাদে নতুন ডেটা সংযুক্ত করা হয় the

    command >> out.txt

    যদি out.txtবিদ্যমান থাকে তবে এর মধ্যে আগে যা রয়েছে তার পরে আউটপুট এতে commandযুক্ত হবে। এটি উপস্থিত না থাকলে এটি তৈরি করা হবে।

  • &>, >&, >>&এবং &>>: (অ-মানক)। যথাক্রমে প্রতিস্থাপন বা সংযোজন, স্ট্যান্ডার্ড ত্রুটি এবং স্ট্যান্ডার্ড আউটপুট উভয়ই পুনর্নির্দেশ করুন।

    command &> out.txt

    এর স্ট্যান্ডার্ড ত্রুটি এবং স্ট্যান্ডার্ড আউটপুট উভয়ই commandসংরক্ষণ করা হবে out.txt, এর বিষয়বস্তুগুলিকে ওভাররাইট করে অথবা এটি উপস্থিত না থাকলে তৈরি করা হবে।

    command &>> out.txt

    উপরের হিসাবে out.txt, এটি উপস্থিত থাকলে তা বাদ দিলে আউটপুট এবং ত্রুটি এতে commandযুক্ত হবে।

    &>বৈকল্পিক মধ্যে উত্পন্ন bashসময়, >&বৈকল্পিক csh এর মূল (দশক আগে) থেকে আসে। তারা উভয়ই অন্য পসিক্স শেল অপারেটরের সাথে বিরোধ করে এবং পোর্টেবল shস্ক্রিপ্টগুলিতে ব্যবহার করা উচিত নয় ।

  • <<: এখানে একটি দলিল। এটি প্রায়শই মাল্টি-লাইন স্ট্রিংগুলি মুদ্রণ করতে ব্যবহৃত হয়।

     command << WORD
         Text
     WORD

    এখানে, commandযতক্ষণ না এটি পরবর্তী সংঘটন খোঁজে সবকিছু নিতে হবে WORD, Textউপরের উদাহরণে, ইনপুট হিসাবে। WORDপ্রায়শই EoFবা এর বিভিন্নতা থাকলেও এটি আপনার পছন্দ মতো কোনও বর্ণমালা (এবং কেবল নয়) স্ট্রিংও হতে পারে। যখন WORDউদ্ধৃতি দেওয়া হয়, এখানে নথির পাঠ্যটি আক্ষরিক অর্থে চিকিত্সা করা হয় এবং কোনও বিস্তৃতি সম্পন্ন হয় না (উদাহরণস্বরূপ ভেরিয়েবলগুলিতে)। এটি যদি উদ্ধৃত না হয় তবে ভেরিয়েবলগুলি প্রসারিত হবে। আরও বিশদের জন্য ব্যাশ ম্যানুয়ালটি দেখুন

    আপনি যদি আউটপুটটিকে command << WORD ... WORDঅন্য কোনও কমান্ড বা কমান্ডগুলিতে সরাসরি পাইপ করতে চান তবে আপনাকে পাইপটি একই লাইনে << WORDরাখতে হবে, আপনি এটি সমাপ্ত WORD এর পরে বা নিম্নলিখিত লাইনে রাখতে পারবেন না। উদাহরণ স্বরূপ:

     command << WORD | command2 | command3...
         Text
     WORD
  • <<<: এখানে স্ট্রিংস, এখানে নথির অনুরূপ, তবে একটি একক লাইনের উদ্দেশ্যে। এগুলি কেবল ইউনিক্স পোর্ট বা আরসি (যেখানে এটি উদ্ভূত হয়েছিল), জেডএস, ksh, যশ এবং ব্যাশের কিছু বাস্তবায়ন রয়েছে।

    command <<< WORD

    যা দেওয়া হয় WORDতা প্রসারিত হয় এবং এর মান ইনপুট হিসাবে পাস হয় command। এটি প্রায়শই কোনও কমান্ডের ইনপুট হিসাবে ভেরিয়েবলের সামগ্রীটি পাস করার জন্য ব্যবহৃত হয়। উদাহরণ স্বরূপ:

     $ foo="bar"
     $ sed 's/a/A/' <<< "$foo"
     bAr
     # as a short-cut for the standard:
     $ printf '%s\n' "$foo" | sed 's/a/A/'
     bAr
     # or
     sed 's/a/A/' << EOF
     $foo
     EOF

আরও কয়েকটি অপারেটর ( >&-, x>&y x<&y) ফাইল বর্ণনাকারী বন্ধ বা সদৃশ করতে ব্যবহৃত হতে পারে। তাদের উপর বিস্তারিত জানার জন্য, দয়া করে আপনার শেল এর ম্যানুয়াল প্রাসঙ্গিক অধ্যায় (দেখুন এখানে উদাহরণস্বরূপ ব্যাশ জন্য)।

এটি কেবল বোর্নের মতো শেলগুলির সর্বাধিক সাধারণ অপারেটরদের কভার করে। কিছু শেলের নিজস্ব কয়েকটি অতিরিক্ত পুনর্নির্দেশ অপারেটর রয়েছে।

Ksh, ব্যাশ এবং zsh এছাড়াও নির্মান আছে <(…), >(…)এবং =(…)(যে আধুনিক এক zshশুধুমাত্র)। এগুলি পুনঃনির্দেশ নয়, তবে বিকল্প প্রতিস্থাপন


2
এটি সম্ভবত লক্ষণীয় হবে যে সমস্ত শাঁস সমান নয় এবং বিশেষত ব্যাশ-নির্দিষ্ট বৈশিষ্ট্যগুলি হাইলাইট করে।
গ্রেগ হিউগিল 6:34

1
@ গ্রেগ হিউগিল হ্যাঁ, আমি এ কথাটি ছড়িয়ে দিয়েছি যে আমি শ্রদ্ধার সাথে আলোচনা করছি bash। বিভিন্ন "এই উদ্ভট জিনিসটি কী করে" প্রশ্নগুলি বন্ধ করার জন্য এটি একটি ক্যানোনিকাল প্রশ্নোত্তর হিসাবে তৈরি করা হচ্ছে এবং তাদের বেশিরভাগ বাশ ব্যবহারকারীদের from আমি আশা করছি যে অন্য কেউ বাছাই করবে এবং নন ব্যাশ শেলের জন্য উত্তর দেবে, তবে ব্যাশ-নির্দিষ্টটি হাইলাইট করা অনেক অর্থবোধ করে। যদিও আমাকে যাচাই করতে হবে, আমি জানি না যে এগুলি আমার মাথার উপরের দিক থেকে।
টেরডন

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

@ মাইক্রোজার ধন্যবাদ যদিও তারা বাশ এবং zsh এ কাজ করে। আমি জানি না কী, যদি কিছু থাকে তবে সেই তালিকায় সত্যই বাশ-নির্দিষ্ট। আমার এটির মধ্য দিয়ে যাওয়া উচিত এবং প্রতিটি শেলগুলি কাজ করা উচিত তবে এটির আগে সন্ধান করা জড়িত।
টেরডন

1
@ আর্ক 676 না, তারা সত্য বা মিথ্যা মূল্যায়ন করে না, এটি সম্পূর্ণ ভিন্ন প্রসঙ্গ। এর ঠিক অর্থ হ'ল নন-0 এর একটি প্রস্থান মূল্য একটি সমস্যা (না false) নির্দেশ করে এবং 0 এর একটি প্রস্থান কোড সাফল্যকে নির্দেশ করে (না true)। এটি সর্বদা উপায় এবং বেশ মানক। একটি অ -0 প্রস্থান কোড আমার পরিচিত প্রতিটি পরিবেশে একটি ত্রুটি নির্দেশ করে।
টেরডন

60

'>' সম্পর্কিত সতর্কতা

ইউনিক্স সূচনাপ্রাপ্ত যারা কেবলমাত্র I / O পুনঃনির্দেশ সম্পর্কে শিখেছে ( <এবং >) প্রায়শই পছন্দ মতো জিনিসগুলি চেষ্টা করে

কমান্ড ... input_file > the_same_file

অথবা

কমান্ড … < ফাইল      > the_same_file

বা, প্রায় সমানভাবে,

বিড়াল ফাইল | কমান্ড …> the_same_file

( grep, sed, cut, sort, এবং spellকমান্ড যে মানুষ এই মত নির্মানের ব্যবহার করার জন্য লুব্ধ উদাহরণ।) ব্যবহারকারীদের যে এই পরিস্থিতিতে ফাইল ফলে খালি হয়ে আবিষ্কার বিস্মিত হয়।

অন্যান্য উত্তরে উল্লেখ করা হয়নি বলে মনে হচ্ছে এমন একটি সংক্ষেপ বাশ (১) এর পুনঃনির্দেশ বিভাগের প্রথম বাক্যে লুকিয়ে থাকতে দেখা যাবে :

কমান্ড কার্যকর করার আগে, শেল দ্বারা ব্যাখ্যা করা একটি বিশেষ স্বরলিপি ব্যবহার করে এর ইনপুট এবং আউটপুট পুনর্নির্দেশ করা যেতে পারে ।

কমান্ডটি কার্যকর হওয়ার আগেলাল ত্রিভুজ মধ্যে বিস্মৃত চিহ্ন শেলটি অনুরোধিত পুনঃনির্দেশ (গুলি) সম্পাদন করে তার উপর জোর দেওয়ার জন্য প্রথম পাঁচটি শব্দটি সাহসী, ত্রিভুজ, আন্ডারলাইন করা, প্রসারিত, ঝলকানি, রঙিন লাল এবং একটি আইকন দিয়ে চিহ্নিত করা উচিত । এবং মনে রাখবেন

আউটপুট পুনঃনির্দেশের ফলে ফাইলটি… লেখার জন্য খোলা হবে…। ফাইল উপস্থিত না থাকলে, এটি তৈরি করা হয়; যদি এটি বিদ্যমান থাকে তবে এটি শূন্য আকারে কাটা হবে।

  1. সুতরাং, এই উদাহরণে:

    sort roster > roster

    প্রোগ্রামটি চালু rosterহওয়ার আগে শেল ফাইলটি রচনা করে এটি কেটে দেয় (অর্থাত্, এটির সমস্ত বিষয়বস্তু বাদ দিয়ে) sort। স্বাভাবিকভাবেই, তথ্য পুনরুদ্ধার করার জন্য কিছুই করা যায় না।

  2. কেউ সম্ভবত নির্বিঘ্নে এটি আশা করে

    tr "[:upper:]" "[:lower:]" < poem > poem

    আরও ভাল হতে পারে। যেহেতু শেলটি বাম থেকে ডানদিকে পুনঃনির্দেশগুলি পরিচালনা করে, এটি লেখার জন্য এটি খোলার আগে (স্ট্যান্ডার্ড আউটপুট জন্য) এটি poemপড়ার জন্য ( trস্ট্যান্ডার্ড স্ট্যান্ডার্ড ইনপুট জন্য) খোলে। তবে তাতে কোনও লাভ হয় না। যদিও ক্রমের এই ক্রমটি দুটি ফাইল হ্যান্ডেল দেয়, তারা উভয়ই একই ফাইলের দিকে নির্দেশ করে। শেলটি পড়ার জন্য ফাইলটি খুললে, সামগ্রীগুলি এখনও সেখানে থাকে, তবে প্রোগ্রামটি কার্যকর হওয়ার আগে তারা এখনও আঁটসাঁট হয়ে যায়। 

তাই এটা সম্পর্কে কি করতে হবে?

সমাধানগুলির মধ্যে রয়েছে:

  • আপনি যে প্রোগ্রামটি চালাচ্ছেন তার আউটপুট কোথায় যায় তা নির্দিষ্ট করার নিজস্ব, অভ্যন্তরীণ, ক্ষমতা আছে কিনা তা পরীক্ষা করে দেখুন। এটি প্রায়শই একটি -o(বা --output=) টোকেন দ্বারা নির্দেশিত হয় । নির্দিষ্টভাবে,

    sort roster -o roster

    মোটামুটি সমান

    sort roster > roster

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

    একইভাবে, অন্তত কিছু সংস্করণে sedএকটি আছে -i(সম্পাদনা আমার এন স্থান) বিকল্পটি আউটপুট ফিরে ইনপুট ফাইলে লিখতে ব্যবহার করা যেতে পারে (আবার, পরে সমস্ত ইনপুট পড়া হয়েছে)। মত এডিটরস ed/ ex, emacs, pico, এবং vi/ vim ব্যবহারকারী একটি টেক্সট ফাইল সম্পাদনা করতে এবং মূল ফাইল সম্পাদনা পাঠ্য সংরক্ষণ করার অনুমতি দেয়। নোট করুন ed(কমপক্ষে) অ-ইন্টারেক্টিভভাবে ব্যবহার করা যেতে পারে।

    • viসম্পর্কিত বৈশিষ্ট্য আছে। আপনি যদি টাইপ করেন তবে এটি সম্পাদনা বাফারের সামগ্রীগুলি এতে লিখে , আউটপুটটি পড়বে এবং এটি বাফারে প্রবেশ করবে (মূল বিষয়বস্তুগুলি প্রতিস্থাপন করে)।:%!commandEntercommand
  • সহজ তবে কার্যকর:

    কমান্ডইনপুট_ফাইলে > টেম্প_ফায়াল   && এমভি  টেম্পল_ফিল ইনপুট_ফাইলে

    এটির একটি অপূর্ণতা রয়েছে যা যদি input_fileকোনও লিঙ্ক হয় তবে এটি (সম্ভবত) একটি পৃথক ফাইল দ্বারা প্রতিস্থাপন করা হবে। এছাড়াও, নতুন ফাইলটি আপনার মালিকানাধীন থাকবে ডিফল্ট সুরক্ষাগুলির সাথে। বিশেষত, এটি ঝুঁকি বহন করে যে ফাইলটি বিশ্ব-পঠনযোগ্য হয়ে উঠবে, এমনকি যদি আসলটি input_fileনা ছিল।

    প্রকারভেদ:

    • commandinput_file > temp_file && cp temp_file input_file && rm temp_file
      যা এখনও (সম্ভাব্য) temp_fileবিশ্ব-পাঠযোগ্য ছাড়বে leave আর ভালো:
    • cp input_file temp_file && commandtemp_file > input_file && rm temp_file
      এগুলি ফাইলের লিঙ্কের স্থিতি, মালিক এবং মোড (সুরক্ষা) সংরক্ষণ করে, দ্বিগুণ আই / ও দ্বিগুণ ব্যয়ে। (আপনি একটি অপশন ব্যবহার করার প্রয়োজন হতে পারে -aবা -pউপর cp বৈশিষ্ট্যাবলী সংরক্ষণ তা জানাও।)
    • commandinput_file > temp_file &&
      cp --attributes-only --preserve=all input_file temp_file &&
      mv temp_file input_file
      (কেবল পঠনযোগ্যতার জন্য পৃথক লাইনে বিভক্ত) এটি ফাইলের মোড সংরক্ষণ করে (এবং আপনি যদি রুট হন তবে মালিক), তবে এটি আপনার নিজের মালিকানাধীন করে তোলে (আপনি যদি রুট না হন) এবং এটিকে একটি নতুন করে তোলে, পৃথক ফাইল।
  • এই ব্লগটি (ফাইলগুলির "ইন-প্লেস" সম্পাদনা) পরামর্শ দেয় এবং ব্যাখ্যা করে

    m আরএম ইনপুট_ফিল   &&   কমান্ড …> ইনপুট_ফাইল ; input < ইনপুট_ফাইল

    এটি প্রয়োজনীয় commandস্ট্যান্ডার্ড ইনপুট প্রক্রিয়া করতে সক্ষম হওয়া প্রয়োজন (তবে প্রায় সমস্ত ফিল্টার পারে)। ব্লগ নিজেই এটিকে একটি ঝুঁকিপূর্ণ কলজ বলে অভিহিত করে এবং এর ব্যবহারকে নিরুৎসাহিত করে। এবং এটি আপনার মালিকানাধীন এবং ডিফল্ট অনুমতি সহ একটি নতুন, পৃথক ফাইল (কোনও কিছুর সাথে লিঙ্কযুক্ত নয়) তৈরি করবে।

  • মোর্যুটিলস প্যাকেজের একটি কমান্ড রয়েছে sponge:

    কমান্ডইনপুট_ফাইল | স্পঞ্জ the_same_file

    আরও তথ্যের জন্য এই উত্তর দেখুন ।

এখানে আমার কাছে সম্পূর্ণ অবাক হওয়ার মতো কিছু রয়েছে: সিনট্যাক্সারর বলেছেন :

[এই সমাধানগুলো অধিকাংশ] শুধুমাত্র পাঠযোগ্য ফাইল সিস্টেম, যেখানে "শুধুমাত্র পাঠযোগ্য" মানে হল আপনার উপর ব্যর্থ হবে $HOME হবে লিখনযোগ্য, কিন্তু /tmpকরা হবে না -কেবল পঠন (ডিফল্ট অনুসারে)। উদাহরণস্বরূপ, যদি আপনার উবুন্টু থাকে এবং আপনি পুনরুদ্ধার কনসোলটি বুট করেছেন তবে সাধারণত এটি হয়। এছাড়াও, এখানে নথি অপারেটর <<<সেখানে পারেন কাজ করবে না, এটি প্রয়োজন হিসাবে /tmpকরা / লেখা পড়া হয়েছে কারণ এটি পাশাপাশি সেখানে একটি অস্থায়ী ফাইল লিখতে হবে।
(সিএফ। এই প্রশ্নের একটি strace'ডি আউটপুট অন্তর্ভুক্ত )

নিম্নলিখিত ক্ষেত্রে নিম্নলিখিত ক্ষেত্রে কাজ করতে পারে:

  • উন্নত ব্যবহারকারীদের জন্য শুধুমাত্র: (যেমন, আপনার আদেশ হিসাবে ইনপুট আউটপুট তথ্য একই পরিমাণ উত্পাদন করতে নিশ্চিত করা হয় তাহলে sort, বা tr ছাড়া-d বা -sবিকল্প), আপনি চেষ্টা করে দেখতে পারেন
    কমান্ডইনপুট_ফাইল | = এর DD the_same_file পরিবর্তন = notrunc
    দেখুন এই উত্তর এবং এই উত্তরটি উপরে একটি ব্যাখ্যা সহ আরো তথ্য, জন্য, এবং বিকল্প যে কাজ যদি আপনার আদেশ হিসাবে ইনপুট আউটপুট তথ্য একই পরিমাণ উত্পাদন করতে নিশ্চিত করা হয় বা তার কম (যেমন, grepঅথবা cut)। এই উত্তরগুলির সুবিধা রয়েছে যে তাদের কোনও মুক্ত স্থানের প্রয়োজন নেই (বা তাদের খুব কম প্রয়োজন)। ফর্মের উপরের উত্তরগুলির স্পষ্টরূপে প্রয়োজন যে সিস্টেমে পুরো ইনপুট (পুরানো) ফাইল এবং আউটপুট (নতুন) ফাইল একসাথে রাখতে সক্ষম হওয়ার জন্য পর্যাপ্ত ফাঁকা জায়গা থাকতে হবে; এটি অন্যান্য সমাধানগুলির (যেমন, এবং ) বেশিরভাগ ক্ষেত্রেই স্পষ্টতই সত্য নয় । ব্যতিক্রম: সম্ভবত প্রচুর পরিমাণে মুক্ত স্থানের প্রয়োজন হবে, কারণcommandinput_file > temp_file && …sed -ispongesort … | dd …sort কোনও আউটপুট লেখার আগে এর সমস্ত ইনপুট পড়তে হবে এবং অস্থায়ী ফাইলের সমস্ত তথ্য না থাকলে সম্ভবত এটি সবচেয়ে বেশি বাফার করে।
  • শুধুমাত্র উন্নত ব্যবহারকারীদের জন্য:
    কমান্ড ... input_file 1 <> the_same_file
    ddউপরের উত্তরের সমতুল্য হতে পারে । সিনট্যাক্স ফাইল বর্ণনাকারী উপর নামের ফাইল খোলে উভয় ইনপুট এবং আউটপুট জন্য , এটা ছিন্ন ছাড়া - সংমিশ্রণ সাজানোর এবং । দ্রষ্টব্য: কিছু প্রোগ্রাম (যেমন, এবং ) এই দৃশ্যে চালাতে অস্বীকার করতে পারে কারণ তারা সনাক্ত করতে পারে যে ইনপুট এবং আউটপুট একই ফাইল। উপরের আলোচনার জন্য এই উত্তরটি দেখুন এবং এমন একটি স্ক্রিপ্ট যা এই উত্তরটিকে কার্যকর করে যদি আপনার আদেশটি ইনপুট বা তার চেয়ে কম পরিমাণে একই পরিমাণ আউটপুট ডেটা উত্পাদন করার গ্যারান্টিযুক্ত থাকে । সতর্কতা: আমি পিটারের স্ক্রিপ্ট পরীক্ষা করি নি, তাই এটির জন্য আমি কোনও নিশ্চয়তা দিই না।n<> filen n<n>catgrep

তো, প্রশ্ন কী ছিল?

এটি ইউ ও এল-এ একটি জনপ্রিয় বিষয় হয়ে দাঁড়িয়েছে; এটি নিম্নলিখিত প্রশ্নগুলিতে সম্বোধন করা হয়েছে:

… এবং এটি সুপার ব্যবহারকারী বা জিজ্ঞাসা উবুন্টুকে গণনা করছে না। আমি এই উত্তরে উপরের প্রশ্নের উত্তরগুলি থেকে প্রচুর তথ্য একত্রিত করেছি, তবে সমস্ত নয়। (অর্থাত্ আরও তথ্যের জন্য উপরের তালিকাভুক্ত প্রশ্নাবলী এবং তাদের উত্তরগুলি পড়ুন))

PS উপরে বর্ণিত ব্লগটির সাথে আমার কোনও সম্পর্ক নেই


যেহেতু এই প্রশ্নটি অব্যাহত থাকে, তাই আমি ভেবেছিলাম "ক্যানোনিকাল উত্তর" লেখার জন্য আমি আমার হাত চেষ্টা করব। আমি কি এখানে এটি পোস্ট করতে পারি (এবং সম্ভবত আরও বেশ কয়েকটি ভারী পাচার হওয়া প্রশ্নগুলির সাথে এটির লিঙ্ক করব), বা আমি কি আসলেই এই সমস্যাটি উত্থাপনকারী একটি প্রশ্নের মধ্যে স্থানান্তরিত করব? এছাড়াও, এটি কি এমন পরিস্থিতি যেখানে প্রশ্নগুলি একত্রিত করা উচিত?
স্কট

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

@ মিমকিজার: হ্যাঁ, (1) আমি সিনট্যাক্সারির উদ্ধৃতি দিচ্ছি, এবং (2) আমি বলেছি আমি অবাক হয়েছি। আমি ভেবেছিলাম, যদি কিছু পড়তে-লেখা হয় তবে তা হবে /tmp
স্কট

ঠিক আছে, @ স্যানট্যাক্সেররার যে জিনিসটি বলেছে তা দ্বিগুণ অদ্ভুত কারণ কারণ আমি মনে করি, dashউবুন্টুতে এটি পূর্বনির্ধারিত পুনরুদ্ধার শেল হবে এবং এটি কেবল কোনও <<<পঠনকারীকে বুঝতে পারে না , তবে এটি <<বংশগতির জন্য বেনামে পাইপও পেয়েছে এবং এটির জন্য কোনও গোলমাল করবে না ${TMPDIR:-/tmp}for আদৌ উদ্দেশ্য। ডকুমেন্ট হ্যান্ডলিংয়ে ডেমোগুলির জন্য এটি বা এটি দেখুন । এছাড়াও একই পরিমাণ আউটপুট বা কম সতর্কতা কেন?
মাইকজার্ভ

@ মিমকিজার: আচ্ছা, dd … conv=notruncএবং 1<>উত্তরগুলি কখনই আউটপুট ফাইলকে ছাঁটাই করে না, সুতরাং, কমান্ডের আউটপুট যদি ইনপুট (উদাহরণস্বরূপ grep) এর চেয়ে কম হয় তবে ফাইলটির শেষে মূল বামদিকে কিছু বাইট থাকবে। এবং যদি আউটপুট ইনপুট চেয়ে বড় (যেমন, cat -n, nl, অথবা (সম্ভাব্য) grep -n), সেখানে পুরনো তথ্য মুছে যাওয়ার আগে আপনি এটা পড়েছি একটি ঝুঁকি আছে।
স্কট

29

আরো পর্যবেক্ষণের উপর ;, &, (এবং)

  • দ্রষ্টব্য যে টেরডনের উত্তরের কয়েকটি আদেশ কমান্ড হতে পারে। উদাহরণস্বরূপ, আপনি বলতে পারেন

    command1 ;

    (না সহ command2) এটি সমান

    command1

    (যেমন, এটি কেবল command1অগ্রভাগে চলে এবং এটি শেষ হওয়ার জন্য অপেক্ষা করে ara তুলনামূলকভাবে,

    command1 &

    (না সহ command2) command1পটভূমিতে আরম্ভ হবে এবং তারপরে তত্ক্ষণাত অন্য শেল প্রম্পট জারি করবে।

  • বিপরীতে command1 &&, command1 ||এবং command1 |কোন মানে হয় না। আপনি যদি এর মধ্যে একটি টাইপ করেন তবে শেলটি (সম্ভবত) ধরে নেবে যে কমান্ডটি অন্য লাইনে চালিয়ে গেছে। এটি মাধ্যমিক (ধারাবাহিকতা) শেল প্রম্পট প্রদর্শন করবে যা সাধারণত সেট করা থাকে >এবং পড়া চালিয়ে যায়। শেল স্ক্রিপ্টে, এটি কেবলমাত্র পরবর্তী পংক্তিটি পড়বে এবং এটি ইতিমধ্যে যা পড়েছে তা এতে যুক্ত করবে। (সাবধান! আপনি যা হতে চান এটি এটি নাও হতে পারে))

    দ্রষ্টব্য: কিছু শেলের কয়েকটি সংস্করণ তেমনি অসম্পূর্ণ কমান্ডগুলিকে ত্রুটি হিসাবে বিবেচনা করে। এই জাতীয় ক্ষেত্রে (বা, প্রকৃতপক্ষে, আপনার দীর্ঘ কমান্ড রয়েছে এমন কোনও ক্ষেত্রে), \শেলটি অন্য লাইনে কমান্ডটি পড়া চালিয়ে যেতে বলার জন্য আপনি একটি লাইনের শেষে একটি ব্যাকস্ল্যাশ ( ) রাখতে পারেন:

    command1  &&  \
    command2

    অথবা

    find starting-directory -mindepth 3 -maxdepth 5 -iname "*.some_extension" -type f \
                            -newer some_existing_file -user fred -readable -print
  • যেমন টেরডন বলেছে, (এবং )গ্রুপ কমান্ডগুলিতে ব্যবহার করা যেতে পারে। তারা যে আলোচনার "সত্যই প্রাসঙ্গিক নয়" উক্তিটি বিতর্কযোগ্য। Terdon এর উত্তরে কমান্ড কিছু কমান্ড হতে পারে গ্রুপ । উদাহরণ স্বরূপ,

    ( command1 ; command2 )  &&  ( command3; command4 )

    এই আছে:

    • দৌড়াও command1এবং এটি শেষ হওয়ার জন্য অপেক্ষা করুন।
    • তারপরে, সেই প্রথম কমান্ডটি চালানোর ফলাফল নির্বিশেষে, চালান command2এবং এটি শেষ হওয়ার জন্য অপেক্ষা করুন।
    • তারপরে, যদি command2সফল হয়,

      • দৌড়াও command3এবং এটি শেষ হওয়ার জন্য অপেক্ষা করুন।
      • তারপরে, এই আদেশটি চালানোর ফলাফল নির্বিশেষে, চালান command4এবং এটি শেষ হওয়ার জন্য অপেক্ষা করুন।

      যদি command2ব্যর্থ হয়, কমান্ড লাইনের প্রক্রিয়া বন্ধ করুন।

  • বাহু বন্ধনী, |খুব শক্তভাবে আবদ্ধ, তাই

    command1 | command2 || command3

    সমতুল্য

    ( command1 | command2 )  ||  command3

    এবং &&এবং ||তুলনায় কঠিন বাঁধে ;, তাই

    command1 && command2 ; command3

    সমতুল্য

    ( command1 && command2 ) ;  command3

    অর্থাৎ, এবং / অথবা command3এর প্রস্থান স্থিতি নির্বিশেষে কার্যকর করা হবে ।command1command2


পারফেক্ট, +1! আমি বলেছিলাম যে তারা প্রাসঙ্গিক নয় কারণ আমি এতটা বিশদে যেতে চাইনি। আমি এমন একটি উত্তর চেয়েছিলাম যা নবাবিদের জন্য দ্রুত চিটশিট হিসাবে কাজ করতে পারে যারা বিভিন্ন কমান্ডের শেষে সমস্ত অদ্ভুত স্কুইগলস কী তা ভাবছেন। আমি বোঝাতে চাইছি না যে তারা কার্যকর নয়। এই সব যোগ করার জন্য ধন্যবাদ।
টেরডন

1
আমি "সমালোচনামূলক ভর" সমস্যা সম্পর্কে উদ্বিগ্ন - আমরা যদি শেল সম্পর্কে সম্ভবত যা বলতে পারি তার সব কিছু পোস্ট করি তবে আমরা আমাদের নিজস্ব টিএল; বাশ রেফারেন্স ম্যানুয়ালের ডিআর সংস্করণটি শেষ করব ।
জি ম্যান

উল্লেখ করার মতো: সি পরিবারের ভাষাগুলির থেকে আলাদা, ;নিজে থেকেই (বা এর আগে কোনও কমান্ড ছাড়াই) একটি বাক্য গঠন ত্রুটি, এবং খালি বক্তব্য নয়। এইভাবে ; ;একটি ত্রুটি। (নতুন ব্যবহারকারীদের জন্য একটি সাধারণ সমস্যা, আইএমএইচও)। এছাড়াও: বিবৃতি ;;জন্য একটি বিশেষ সীমানা case
مورু

1
@ মুরু: ভাল কথা, তবে আসুন এটি সাধারণীকরণ করুন। কোন নিয়ন্ত্রণ অপারেটার যে কমান্ড মধ্যে প্রদর্শিত করতে পারেন এর: ;, &&, ||, &, এবং |, ত্রুটি, যদি তারা তাদের পূর্ববর্তী কিছুই প্রদর্শিত হয়। এছাড়াও, টার্ডন ;;তার উত্তরে সম্বোধন করলেন (সংক্ষেপে)।
জি ম্যান

1
@ উইল্ডকার্ড: ঠিক আছে, আমি দেখছি আপনি কোথা থেকে এসেছেন। মূল শব্দটি হ'ল "মে"; আমি যা বলছিলাম তা হ'ল আমি গ্যারান্টি দিচ্ছি না যে সমস্ত শেলগুলি এই ধরনের কনস্ট্রাক্ট গ্রহণ করবে (যেমন, ওয়াইএমএমভি)। স্পষ্টতই আমি লিখেছিলাম যে আমি linebreakপসিক্স শেল ব্যাকরণে টোকেনের ব্যবহার সম্পর্কে জানার আগে । সুতরাং সম্ভবত এটি নিরাপদে বলা যায় যে সমস্ত পসিক্স-সম্মতিযুক্ত শেলগুলি সেগুলি গ্রহণ করবে। আমি একটি সাধারণ অস্বীকৃতি হিসাবে আমার বক্তব্যের পাশে দাঁড়িয়েছি; আপনি যদি সত্যিকারের বোর্ন শেল বা পুরানো হিসাবে পুরানো পর্যাপ্ত প্রাক-পসিক্স শেল খুঁজে পান তবে সমস্ত বেট বন্ধ রয়েছে।
জি-ম্যান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.