আর্গুমেন্ট হিসাবে "-" দিয়ে ফাইলগুলি পাস করা থেকে আমি বাশ প্রসারকে কীভাবে আটকাতে পারি?


14

আমি এর সাথে পুনরাবৃত্তভাবে একটি স্ট্রিং অনুসন্ধান করার চেষ্টা করছি grepতবে আমি এটি পেয়েছি:

$ grep -r "stuff" *
grep: unrecognized option '---corporate-discount.csv'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.

আমি বাশকে -যুক্তি হিসাবে শুরু হওয়া ফাইলগুলি পাস করা থেকে কীভাবে বাধা দিতে পারি ?



3
আপনি শেলটি এই ফাইলগুলি পাস হতে আটকাতে চান না, তাই না? প্রশ্নটি বরং কীভাবে এটি জানাতে হয় grepযে তারা বিকল্পগুলি নয়।
— ডনহোলগো

11
... পরিষ্কার করে বললে, বাশ নিয়ন্ত্রণ করে না যে কোন ফলাফলকে বিকল্প হিসাবে বনাম হিসাবে বিবেচনা করা হবে; যে গ্রহণ প্রোগ্রামের নিয়ন্ত্রণে। subprocess.Popen(['grep', '-r', '-e' 'stuff', '--corporate-discount.csv'])পাইথনের সাথে আপনি একই আচরণ পাবেন, কোথাও কোনও বাশ নেই।
— চার্লস ডাফি

1
সম্পর্কিত পড়া: ইউনিক্স ওয়াইল্ডকার্ডস ওয়াইল্ড চলে গেছে, সুরক্ষা সম্পর্কিত সমস্যাগুলি যা *কমান্ড ব্যবহারের ফলে তৈরি হতে পারে । এর ./*পরিবর্তে ব্যবহার করে এগুলি সব এড়ানো যায় ।
— ওয়াইল্ডকার্ড

1
@ উইল্ডকার্ড, সিগিল ---এর বিকল্প হিসাবে ব্যবহার করা পুরোপুরি যুক্তিসঙ্গত; পসিক্স ইউটিলিটি সিনট্যাক্স নির্দেশিকাগুলির জন্য এটি সম্মানিত হওয়া প্রয়োজন; গাইডলাইন # 10 দেখুন। (অবশ্যই, সমস্ত প্রোগ্রামই পসিক্স নির্দেশিকা অনুসরণ করে না, তবে উত্তরটি আপত্তিকর প্রোগ্রামগুলির লেখকদের স্ট্রিং করা এবং / অথবা তাদের শিল্প থেকে বের করে দেওয়া)।
— চার্লস ডাফি

উত্তর:


43

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

ধরে নিই যে আপনি এই জাতীয় ফাইলগুলি প্রক্রিয়া করতে চান (এবং এগুলি পুরোপুরি উপেক্ষা করবেন না), grepবেশিরভাগ প্রোগ্রামের পাশাপাশি --, বিকল্পগুলির সমাপ্তির ইঙ্গিত হিসাবে স্বীকৃতি দেয়, তাই

grep -r -e "stuff" -- *

আপনি যা চান তা করবে -eক্ষেত্রে আছে stuffএকটি দিয়ে শুরু হয় -পাশাপাশি।

বিকল্পভাবে, আপনি এটি ব্যবহার করতে পারেন:

grep -r -e "stuff"  ./*

-বর্তমান ডিরেক্টরিটিতে যদি কোনও ফাইল কল করা থাকে তবে সেই সমস্যাটি এড়াতে পারে । --বিভাজক হওয়ার পরেও স্ট্যান্ডিন হিসাবে অর্থ grepব্যাখ্যা করে -, যখন বর্তমান ডিরেক্টরিটিতে ./-ফাইলটি বলা -হয়।


8

করতে "-" দিয়ে শুরু ফাইল ক্ষণস্থায়ী থেকে ব্যাশ বিস্তার রোধ আপনি ব্যবহার করতে পারেন:

echo [!-]*

যা বেশিরভাগ শেলগুলিতে বহনযোগ্যভাবে কাজ করে, বা, ksh, বাশ, zsh- এর জন্য নির্দিষ্ট:

echo !(-*)

উদাহরণস্বরূপ: এই ফাইলগুলির সাথে একটি ডিরেক্টরিতে

$ echo *
a b c ---corporate-discount.csv d -e --option.txt

কেবল তালিকাবদ্ধ করবে (সরবরাহিত extglobসক্রিয়)

$ shopt -s extglob
$ echo !(-*)
a b c d

$ echo [!-]*
a b c d

আপনি যদি চান তবে গ্রাইপকে বলার সময় সমস্ত ফাইলের প্রক্রিয়া -করা যদি বিকল্প হিসাবে বর্ণিত ফাইলগুলি ব্যাখ্যা না করা হয় তবে কেবল একটি যুক্ত করুন ./:

grep -r "stuff" ./*

অথবা, যদি গ্যারান্টি থাকে যে -তালিকাভুক্ত ফাইলগুলিতে কোনও ফাইল বলা হুবহু উপস্থিত নেই (গ্রেপ স্ট্যান্ডিনের পড়া- হিসাবে নিঃসঙ্গতার ব্যাখ্যা করবে ), আপনি ব্যবহার করতে পারেন:

grep -r -- "stuff" *

হ্যাঁ, প্রশ্ন যেমন একটি জিএনইউ শেল বাশ সম্পর্কিত, এটি ধরে নেওয়া যুক্তিযুক্ত বলে মনে হয় যে একটি জিএনইউ গ্রেপ পাওয়া যায়, ইনস্টল করা যেতে পারে, বা আসলে ব্যবহৃত হচ্ছে। @ স্টাফেনচাজেলাস
— আইজ্যাক

হ্যাঁ, এটি একটি grep -r -- stuff *সহজ, এবং নন-জিএনইউশ গ্রেপের সাথেও কাজ করে। সুতরাং: যোগ, ধন্যবাদ। @ স্টাফেনচাজেলাস
— আইজ্যাক

@ আইসাক আমি এটি যুক্তিসঙ্গত অনুমান হিসাবে বলব না "যদি বাশ পাওয়া যায় তবে জিএনইউ গ্রেপও উপলব্ধ"। উদাহরণস্বরূপ ফ্রিবিএসডি নিন: ব্যাশটি ডিফল্টরূপে ইনস্টল করা হয় না , যা পরে ইনস্টল করা যেতে পারে, তবে গ্রেপের কোনও প্রভাব নেই - এটি জিএনইউ গ্রেপ সুস্পষ্টভাবে ইনস্টল না করা পর্যন্ত গ্রেপের বিএসডি সংস্করণ হিসাবে থেকে যায়। তবে এটি একটি ছোটখাটো নিটপিক। আমি extglob মাধ্যমে বিকল্প পদ্ধতিতে মত, অত: পর + + উত্তর 1'ed
— Sergiy Kolodyazhnyy

2
grepফ্রিবিএসডি-তে @ সার্জিইক্লোডিয়াজন্য, আফাইক, এখনও জিএনইউ-র উপর ভিত্তি করে রয়েছে grepএবং এখনও রয়েছে যে অপারণের ফলে বিকল্পগুলি স্বীকৃত নয়। এমনকি ওপেনবিএসডি-র মতো বিএসডিগুলি তাদের পুনর্লিখন করেছে grepযা তাদের পিছিয়ে পড়া বহনযোগ্যতার জন্য জিএনইউ সামঞ্জস্যপূর্ণ করেছে (এবং এখনও এই আচরণটি এখানে দেখায়)। ম্যাকোস-এ, শ বাশ, তবে আমি তাদের গ্রেপকে OS পসিক্সএলই_কোরিট না করেও ম্যাকোস হিসাবে পসিক্স অনুগত বলে ম্যাকস হিসাবে বোঝাতে চাইব না expect যাই হোক, অপ এর, grep হয় গনুহ সামঞ্জস্যপূর্ণ যেহেতু এটি যে ত্রুটি দেয়।
— স্টাফেন চেজেলাস

1
echo [!-]*Ksh এর (বা bash -O extglobএর) মানক সমতুল্য হিসাবেও দেখুন echo !(-*)।
— স্টাফেন চেজেলাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.