ব্যাকটিক (বা ... (...)) বিস্তৃতিতে ফাঁকা স্থান রক্ষার কোনও উপায় নেই?
না, নেই। তা কেন?
কোনটি সুরক্ষিত করা উচিত এবং কোনটি করা উচিত নয় তা বাশের কোনও উপায় নেই
ইউনিক্স ফাইল / পাইপে কোনও অ্যারে নেই। এটি কেবল একটি বাইট স্ট্রিম। ``
বা এর ভিতরে থাকা কমান্ডটি $()
একটি প্রবাহকে আউটপুট দেয়, যা ব্যাশ গ্রাস করে এবং একক স্ট্রিং হিসাবে আচরণ করে। সেই হিসাবে, আপনার কাছে কেবল দুটি পছন্দ রয়েছে: এটিকে একটি স্ট্রিং হিসাবে রাখার জন্য, এটিকে উদ্ধৃতিতে রাখুন বা এটিকে নগ্ন রাখুন, যাতে ব্যাশটি এটির কনফিগার করা আচরণ অনুযায়ী আলাদা করে দেয়।
সুতরাং আপনি যদি অ্যারে চান তবে আপনাকে যা করতে হবে তা হল একটি অ্যারে রয়েছে এমন একটি বাইট ফর্ম্যাটটি সংজ্ঞায়িত করা এবং এটি যা সরঞ্জামগুলি পছন্দ করে xargs
এবং find
করতে পারে: আপনি যদি তাদেরকে -0
যুক্তি দিয়ে চালান , তারা বাইনারি অ্যারে ফর্ম্যাট অনুসারে কাজ করে যা উপাদানগুলি সমাপ্ত করে নাল বাইট, অন্যথায় অস্বচ্ছ বাইট প্রবাহে শব্দার্থ যুক্ত করে।
দুর্ভাগ্যক্রমে, bash
নাল বাইটে স্ট্রিংগুলি বিভক্ত করার জন্য কনফিগার করা যায় না। আমাদের তা পারার জন্য /unix//a/110108/17980 ধন্যবাদ zsh
।
xargs
আপনি চান আপনার আদেশটি একবার চালিত হোক এবং আপনি বলেছিলেন যে xargs -0 -n 10000
আপনার সমস্যার সমাধান করে। এটি নয়, এটি নিশ্চিত করে যে আপনার যদি 10000 এর বেশি পরামিতি থাকে তবে আপনার কমান্ডটি একাধিকবার চলবে।
আপনি যদি এটিকে কঠোরভাবে একবার চালাতে চান বা ব্যর্থ করতে চান তবে আপনাকে -x
আর্গুমেন্ট এবং -n
আর্গুমেন্টের চেয়ে বড় -s
আর্গুমেন্ট সরবরাহ করতে হবে (সত্যই: যথেষ্ট বড় যে শূন্য-দৈর্ঘ্যের আর্গুমেন্টের পুরো গুচ্ছ প্লাস কমান্ডের নামটি ফিট না করে) -s
সাইজ)। ( ম্যান xargs , খুব নীচে অংশ দেখুন)
আমি বর্তমানে যে সিস্টেমে আছি তাতে একটি স্ট্যাক প্রায় 8 এম এর মধ্যে সীমাবদ্ধ রয়েছে, তাই এখানে আমার সীমাবদ্ধতা রয়েছে:
$ printf '%s\0' -- {1..1302582} | xargs -x0n 2076858 -s 2076858 /bin/true
xargs: argument list too long
$ printf '%s\0' -- {1..1302581} | xargs -x0n 2076858 -s 2076858 /bin/true
(no output)
সজোরে আঘাত
আপনি যদি কোনও বাহ্যিক কমান্ড জড়িত না করতে চান তবে /unix//a/110108/17980-এ দেখানো হয়েছে এমন অ্যারে ফিডিং-র লুপ, এ জিনিসগুলিকে বিভক্ত করার একমাত্র উপায় ash নাল বাইট
( . ... "$@" )
স্ট্যাক আকারের সীমাটি এড়ানোর জন্য স্ক্রিপ্ট উত্সের ধারণাটি দুর্দান্ত (আমি চেষ্টা করে দেখলাম, এটি কার্যকর!) তবে সাধারণ পরিস্থিতির জন্য সম্ভবত এটি গুরুত্বপূর্ণ নয়।
প্রক্রিয়া পাইপের জন্য একটি বিশেষ এফডি ব্যবহার করা গুরুত্বপূর্ণ যদি আপনি স্টিডিনের থেকে অন্য কিছু পড়তে চান তবে অন্যথায় আপনার এটির প্রয়োজন হবে না।
সুতরাং, প্রতিদিনের পরিবারের প্রয়োজনের জন্য সহজতম "দেশীয়" উপায়:
files=()
while IFS= read -rd '' file; do
files+=("$file")
done <(find ... -print0)
myscriptornonscript "${files[@]}"
আপনি যদি আপনার প্রক্রিয়া গাছটি পরিষ্কার এবং দেখতে ভাল পছন্দ করেন তবে এই পদ্ধতিটি আপনাকে তা করতে দেয় exec mynonscript "${files[@]}"
, যা বাশ প্রক্রিয়াটিকে মেমরি থেকে সরিয়ে দেয়, নামক কমান্ডের সাথে প্রতিস্থাপন করে। xargs
ডেকে আনা কমান্ডটি চালিত হওয়ার সময় সর্বদা স্মৃতিতে থাকবে, এমনকি যদি কমান্ডটি কেবল একবার চালিত হয়।
নেটিভ বাশ পদ্ধতির বিরুদ্ধে যা কথা বলে তা হ'ল:
$ time { printf '%s\0' -- {1..1302581} | xargs -x0n 2076858 -s 2076858 /bin/true; }
real 0m2.014s
user 0m2.008s
sys 0m0.172s
$ time {
args=()
while IFS= read -rd '' arg; do
args+=( "$arg" )
done < <(printf '%s\0' -- $(echo {1..1302581}))
/bin/true "${args[@]}"
}
bash: /bin/true: Argument list too long
real 107m51.876s
user 107m38.532s
sys 0m7.940s
বাশ অ্যারে হ্যান্ডলিংয়ের জন্য অনুকূলিত হয় না।
ম্যান xargs :
-n সর্বাধিক আরোগুলি
প্রতি কমান্ড লাইনে সর্বাধিক সর্বাধিক-আর্গুমেন্ট যুক্তি ব্যবহার করুন। -X বিকল্পটি দেওয়া না হলে, যদি আকার (-s বিকল্পটি দেখুন) ছাড়িয়ে যায় তবে সর্বাধিক-আরগ্সের চেয়ে কম আর্গুমেন্ট ব্যবহৃত হবে।
-স সর্বোচ্চ অক্ষর
কমান্ড এবং প্রারম্ভিক-আর্গুমেন্ট এবং আর্গুমেন্ট স্ট্রিংয়ের শেষে শেষ হওয়া নালস সহ কম্যান্ড লাইন প্রতি সর্বাধিক সর্বাধিক অক্ষর ব্যবহার করুন Use বৃহত্তম অনুমোদিত অনুমোদিত মান হ'ল সিস্টেম-নির্ভর, এবং নির্বাহের জন্য যুক্তির দৈর্ঘ্য সীমা হিসাবে গণনা করা হয়, আপনার পরিবেশের আকার কম, হেডরুমের কম 2048 বাইট। যদি এই মানটি 128KiB এর বেশি হয় তবে 128Kib ডিফল্ট মান হিসাবে ব্যবহৃত হয়; অন্যথায়, ডিফল্ট মান সর্বাধিক is 1KiB 1024 বাইট।
-এক্স
আকার (-s বিকল্পটি দেখুন) ছাড়িয়ে গেলে প্রস্থান করুন।
IFS="
নিউলাইন,"
)। তবে কি সমস্ত ফাইলের নামের উপরে স্ক্রিপ্ট চালানো দরকার ? যদি তা না হয় তবে প্রতিটি ফাইলের জন্য স্ক্রিপ্টটি সম্পাদন করতে নিজেকে সন্ধান করুন consider