বাশ একটি মেকফিলের অভ্যন্তরে গ্লোববিং বাড়িয়েছে


15

আমি একটি নির্দিষ্ট ফোল্ডারের সমস্ত ফাইলের একটি অপারেশন করতে চাই যা একটি নির্দিষ্ট উপসর্গ (বলুন exclude_) দিয়ে শুরু হয় না । আমার কাছে forবর্ধিত গ্লোবযুক্ত একটি বাশ লুপ রয়েছে যা দেখতে এটির মতো দেখাচ্ছে:

for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done

কমান্ড লাইনে, এটি দুর্দান্ত কাজ করে:

 $ for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done
 foo/bar/apple
 foo/bar/pear
 foo/bar/banana

তবে, আমি যখন এটি কোনও মেকফাইলে ব্যবহার করি:

target:
    for FILE in foo/bar/!(exclude_*) ; do echo $$FILE ; done

আমি নিম্নলিখিত ত্রুটি পেয়েছি:

$ make
for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done
/bin/sh: -c: line 0: syntax error near unexpected token `('
/bin/sh: -c: line 0: `for FILE in foo/bar/!(exclude_*) ; do echo $FILE ; done'

এমন কিছু প্রয়োজনীয় পালাতে হবে যা আমি মিস করেছি?

উত্তর:


7
  1. আপনার সেট করা দরকার extglob
  2. আপনাকে ব্যাশ ব্যবহার করতে বলা উচিত, sh নয়।

Makefile নামক:

SHELL=/bin/bash
.SHELLFLAGS="-O extglob -c"
 ...

2
হুম। কিছু কারণে .SHELLFLAGSআমার পক্ষে কাজ হয়নি, তবে সরাসরি পতাকা লাগানো হয়েছে SHELL=/bin/bash -O extglob -c। কোন ধারণা কেন?
টিমোথি জোন্স

1
হতে পারে আপনি জিএনইউ মেক ব্যবহার করছেন না। অথবা সম্ভবত এটির উদ্ধৃতি প্রয়োজন নেই।
ইগনাসিও ওয়াজকেজ-আব্রামস

জিএনইউ 3.81 করুন এবং জিএনইউ ব্যাশ, সংস্করণ 4.1.2। উদ্ধৃতি ছাড়াও চেষ্টা করা হয়েছে। রহস্যময়।
টিমোথি জোন্স

যাই হোক না কেন, আপনার উত্তরটি আমার জন্য সমাধান হয়েছে একবার আমি সেগুলি সমস্ত এক লাইনে রেখেছি। ধন্যবাদ!
টিমোথি জোন্স

1
.SHELLFLAGSপরিবর্তনশীল গনুহ করতে 3.82 মধ্যে যোগ করা হয়েছিল। NEWS ফাইলের মাধ্যমে কোন বৈশিষ্ট্যগুলি যুক্ত হয়েছিল তা আপনি যাচাই করতে পারেন: git.savannah.gnu.org/cgit/make.git/tree/NEWS
ম্যাড সায়েন্টিস্ট

11

বাশ হ্যাকের সাথে নয়, মেক দিয়ে এটি সমাধান করা আরও মূর্খবাদী এবং আরও বহনযোগ্য would কারও কাছে বাশ ইনস্টল না থাকলে কী হবে?

যাইহোক, এখানে মেক করার সঠিক পদ্ধতি এখানে রয়েছে :

FOOFILES = $(filter-out foo/bar/exclude_%,$(wildcard foo/bar/*))

target:
    for FILE in ${FOOFILES}; do echo $$FILE ; done

2

এখানে একটি সহজ উপায়:

SHELL:=/bin/bash -O globstar

যা গ্লোবস্টারের শেল বিকল্প সক্ষম করবে (যা বিএসডি / ওএস এক্সেও কাজ করে)।


0

এটি মেকফিলের শীর্ষে যুক্ত করুন:

SHELL := bash -O extglob

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