প্যারেনথেসিস ব্যাশ শেল নিজেই কাজ করে তবে ব্যাশ স্ক্রিপ্টে নয়


11

আমি আমার কমান্ড লাইন প্রম্পট থেকে এই আদেশটি চালাতে পারি:

cp -r folder/!(exclude-me) ./

বর্তমান ডিরেক্টরিতে উল্লিখিত উপ-ডিরেক্টরি folder বাদে সমস্ত বিষয় পুনরাবৃত্তভাবে অনুলিপি করতে exclude-me। এটি ঠিক মতো কাজ করে। যাইহোক, আমি লিখেছি এমন ব্যাশ স্ক্রিপ্টে কাজ করার জন্য আমার এটি দরকার, যেখানে আমার এটি রয়েছে:

if [ -d "folder" ]; then
  cp -r folder/!(exclude-me) ./
  rm -rf folder
fi

তবে আমি যখন স্ক্রিপ্টটি চালাব:

bash my-script.sh

বুঝতে পেরেছি:

my-script.sh: line 30: syntax error near unexpected token `('
my-script.sh: line 30: `  cp -r folder/!(exclude-me) ./'

এবং কেন এটি কমান্ড প্রম্পট থেকে কাজ করে তা নিয়ে আমার ক্ষতি হচ্ছে তবে ঠিক একই লাইনটি ব্যাশ স্ক্রিপ্টে কাজ করে না।

উত্তর:


11

এর কারণ আপনি যে সিনট্যাক্সটি ব্যবহার করছেন তা কোনও নির্দিষ্ট বাশ বৈশিষ্ট্যের উপর নির্ভর করে যা অ-ইন্টারেক্টিভ শেল (স্ক্রিপ্ট) এর জন্য ডিফল্টরূপে সক্রিয় হয় না। আপনি আপনার স্ক্রিপ্টে প্রাসঙ্গিক কমান্ড যুক্ত করে এটি সক্রিয় করতে পারেন:

## Enable extended globbing features
shopt -s extglob

if [ -d "folder" ]; then
  cp -r folder/!(exclude-me) ./
  rm -rf folder
fi

এটি সম্পর্কিত বিভাগ man bash:

   If the extglob shell option is enabled using the shopt builtin, several
   extended  pattern  matching operators are recognized.  In the following
   description, a pattern-list is a list of one or more patterns separated
   by a |.  Composite patterns may be formed using one or more of the fol
   lowing sub-patterns:

          ?(pattern-list)
                 Matches zero or one occurrence of the given patterns
          *(pattern-list)
                 Matches zero or more occurrences of the given patterns
          +(pattern-list)
                 Matches one or more occurrences of the given patterns
          @(pattern-list)
                 Matches one of the given patterns
          !(pattern-list)
                 Matches anything except one of the given patterns

এই উত্তরটি আমি দ্বিতীয়বার খুঁজে পেয়েছি (হ্যাঁ, খারাপ স্মৃতি)। এবার env > file1স্ক্রিপ্টে রান চালানোর চেষ্টা করল এবং কার্যকর করল ./it, এবং তারপরে env > file2এবং source itএই আশায় যে আমি এর মধ্যে একটি পার্থক্য খুঁজে পেয়েছি env, যা এটি নয়। আমি কীভাবে প্রোগ্রামের মাধ্যমে দুটি শেলের মধ্যে সমস্ত পার্থক্য তালিকাভুক্ত করতে পারি (এই ক্ষেত্রে ইন্টারেক্টিভ বনাম অ-ইন্টারেক্টিভ)?
এনরিকো মারিয়া ডি অ্যাঞ্জেলিস


2

আপনার স্ক্রিপ্টের উপরে এই লাইনটি যুক্ত করুন:

shopt -s extglob

!(...)এটি একটি বর্ধিত প্যাটার্ন মেলানো বৈশিষ্ট্য, extglobএটির ব্যবহারের জন্য আপনার সক্ষম সক্ষম বিকল্প দরকার । আরও তথ্যের জন্য শপ্ট বিল্টিন দেখুন ।

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