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


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.