এক্সগার্স বাইনারি পরিবর্তে উপনাম ব্যবহার করুন


14

CentOS 6.5 এ 4.2 টি চাপুন:

আমার মধ্যে আমার ~/.bash_profileএকাধিক উপাধি রয়েছে, সহ:

alias grep='grep -n --color=always'

যাতে আমি রঙিন হাইলাইটিং পেতে এবং চলমান চলাকালীন স্বয়ংক্রিয়ভাবে লাইন নম্বর মুদ্রণ করতে পারি grep। আমি যদি নিম্নলিখিতটি চালিত করি, হাইলাইট করা প্রত্যাশা অনুযায়ী কাজ করে:

$ grep -Re 'regex_here' *.py

যাইহোক, যখন আমি সম্প্রতি এটি চালিয়েছি:

$ find . -name '*.py' | xargs grep -E 'regex_here'

ফলাফলগুলি হাইলাইট করা হয়নি এবং লাইন নম্বরগুলি মুদ্রিত হয়নি, আমাকে ফিরে যেতে এবং স্পষ্টভাবে কমান্ডটিতে যুক্ত -n --color=alwaysকরতে বাধ্য করে grep

  • না xargsপরিবেশে alias লেখা পড়েন নি?
  • যদি না হয়, এটি করার উপায় আছে কি?

এই প্রশ্নোত্তর আপনি যা চান তা আছে।
জিম্বন

@ সাইমন ঠিক আছে, এটি মূলত আমার কর্মক্ষেত্রে যা করেছে তা করার জন্য বলছে - xargsকমান্ডটিতে আমাকে নিজের নামটি নিজেই প্রসারিত করতে হয়েছিল । আমি যা জানার চেষ্টা করছি তা হ'ল যদি এমন কোনও উপায় থাকে যে আমি সরাসরি আমার উপন্যাসটি কল করতে পারি xargs
ম্যাটডিমো

1
আপনি কি export GREP_OPTIONS='-n --color=always'আপনার xargs কমান্ডের আগে চেষ্টা করেছেন ?
didal24

@ ডাগো'নীল ধন্যবাদ, যে কাজ করেছে! আমি আমার এটি যোগ করব .bash_profile। একটি উত্তর লিখতে নির্দ্বিধায় ...
ম্যাটডিমো

উত্তর:


11

একটি উপাধি শেলের অভ্যন্তরীণ যেখানে এটি সংজ্ঞায়িত করা হয়েছে। এটি অন্যান্য প্রক্রিয়াগুলিতে দৃশ্যমান নয়। একই শেল ফাংশন জন্য যায়। xargsএকটি পৃথক অ্যাপ্লিকেশন, যা শেল নয়, তাই উপকরণ বা ফাংশনগুলির ধারণা নেই।

আপনি এক্সারগসকে grepসরাসরি ডাকার পরিবর্তে একটি শেল ডেকে আনতে পারেন । তবে কেবল শেলটি চাওয়া যথেষ্ট নয়, আপনাকে সেই শেলের মধ্যেও উপনামটি সংজ্ঞায়িত করতে হবে। যদি উপনামটি আপনার মধ্যে সংজ্ঞায়িত করা হয় তবে .bashrcআপনি সেই ফাইলটি উত্স করতে পারেন; তবে এটি আপনার .bashrcঅন্যান্য কাজগুলি সম্পাদন করতে পারে না যা একটি অ-ইন্টারেক্টিভ শেলের মধ্যে অর্থবোধ করে না।

find . -name '*.py' | xargs bash -c '. ~/.bashrc; grep -E regex_here "$@"' _

Regexp টাইপ করার সময় নেস্টেড কোটিংয়ের জটিলতাগুলি সম্পর্কে সতর্ক থাকুন। আপনি শেলের একটি প্যারামিটার হিসাবে রেজিএক্সপ্যাস পাস করে আপনার জীবনকে সহজ করতে পারেন।

find . -name '*.py' | xargs bash -c '. ~/.bashrc; grep -E "$0" "$@"' regex_here

আপনি স্পষ্টরূপে উলামের অনুসন্ধান করতে পারেন। তারপরেও xargsদেখবেন grep -n --color=always

find . -name '*.py' | xargs "${BASH_ALIASES[grep]}" regex_here

জেডএসে:

find . -name '*.py' | xargs $aliases[grep] regex_here

যাইহোক, নোট করুন যে find … | xargs … স্পেস (অন্যদের মধ্যে) রয়েছে এমন ফাইলের নামগুলিতে বিরতি । নাল-সীমাবদ্ধ রেকর্ডে পরিবর্তন করে আপনি এটি ঠিক করতে পারেন:

find . -name '*.py' -print0 | xargs -0 "${BASH_ALIASES[grep]}" regex_here

বা ব্যবহার করে -exec:

find . -name '*.py' -exec "${BASH_ALIASES[grep]}" regex_here {} +

কল করার পরিবর্তে find, আপনি শেলের ভিতরে পুরোপুরি সবকিছু করতে পারেন। গ্লোব প্যাটার্ন **/ডিরেক্টরিগুলি পুনরাবৃত্তভাবে অনুসরণ করে। ব্যাশে, আপনাকে shopt -s globstarপ্রথমে এই গ্লোব প্যাটার্ন সক্ষম করতে চালানো দরকার ।

grep regex_here **/*.py

এর কয়েকটি সীমাবদ্ধতা রয়েছে:

  • যদি অনেকগুলি ফাইল মিলে যায় (বা তাদের দীর্ঘ পথ রয়েছে) তবে কমান্ডটি ব্যর্থ হতে পারে কারণ এটি সর্বাধিক কমান্ড লাইনের দৈর্ঘ্য ছাড়িয়েছে।
  • বাশ ≤4.2 এ (তবে আরও সাম্প্রতিক সংস্করণগুলিতে বা ksh বা zsh- তে নয়) **/ডিরেক্টরিগুলির প্রতীকী লিঙ্কগুলিতে পুনরাবৃত্তি হয়।

আর একটি পদ্ধতি হ'ল প্রক্রিয়া প্রতিস্থাপনটি ব্যবহার করা, যেমন মারিয়াসম্যাটুয়িয়ে প্রস্তাবিত

grep regex_here <(find . -name '*.py')

**/প্রযোজ্য না হলে এটি কার্যকর: জটিল findঅভিব্যক্তির জন্য বা ব্যাশ .24.2-এ যখন আপনি প্রতীকী লিঙ্কগুলির অধীনে পুনরাবৃত্তি করতে চান না। নোট করুন যে এটি ফাঁকা ফাইলগুলির নামের সাথে বিরতি দেয়; একটি ওয়ার্কঅ্যারাউন্ড হয় সেট IFSএবং অক্ষম globbing , কিন্তু এটা একটি বিট জটিল হতে শুরু করছে চারপাশ:

(IFS=$'\n'; set -f; grep regex_here <(find . -name '*.py') )

এলিয়াস কেন অন্য প্রক্রিয়াগুলিতে দৃশ্যমান হয় না তার স্পষ্ট ব্যাখ্যার জন্য আপনাকে ধন্যবাদ
ম্যাটডিমো

কেউ প্রক্রিয়া বিকল্প ব্যবহার করতে পারেন, আমার উত্তর দেখুন।
মারিয়াসমাতুটিয়

11

ব্যবহার alias xargs='xargs '

alias: alias [-p] [name[=value] ... ]
(snip)
A trailing space in VALUE causes the next word to be checked for
alias substitution when the alias is expanded.

তার জন্য ধন্যবাদ, আমি স্থানের পিছনের ট্রিকিং সম্পর্কে জানতাম না।
MattDMo

NP। এটি sudo...
1.61803

2

দয়া করে এটিকে অন্য পদ্ধতির একটি প্রদর্শন হিসাবে গ্রহণ করুন, যা সম্পর্কিত এসও প্রশ্নে আমি পাই না :

আপনি একটি মোড়ক ফাংশন লিখতে পারেন xargsযার জন্য প্রথম আর্গুমেন্ট একটি উরফ কিনা তা যাচাই করে এবং যদি তা হয় তবে সেই অনুযায়ী এটি প্রসারিত করুন।

এখানে এমন একটি কোড রয়েছে যা হুবহু এটি করে তবে দুর্ভাগ্যক্রমে এটি জেড শেলের প্রয়োজন এবং তাই এটি ব্যাশ দিয়ে 1: 1 চালায় না (এবং সত্যি বলতে গেলে , আমি এটি বন্দর করার জন্য যথেষ্ট ব্যাশ করতে ব্যবহৃত হই না):

xargs () {
        local expandalias
        if [[ $(which $1) =~ "alias" ]]; then
                expandalias=$(builtin alias $1) 
                expandalias="${${(s.'.)expandalias}[2]}"
        else
                expandalias=$1
        fi
        command xargs ${(z)expandalias} "${(z)@[2,-1]}"
}

প্রমাণ, এটি কাজ করে:

zsh% ওরফে গ্রেপ = "গ্রেপ-এন" ´                           # ম্যাচের লাইন সংখ্যা অন্তর্ভুক্ত করে
zsh% foo-name "* .p *" খুঁজে পান | xargs গ্রেপ -E পরীক্ষা
foo বিন্যাস / bar.p0: 151: # ডেটা = পরীক্ষা
foo / bar.p1: 122: # তথ্য = পরীক্ষা # লাইন নম্বর অন্তর্ভুক্ত
zsh% unalias grep 
zsh% foo-name "* .p *" খুঁজে পান xargs গ্রেপ -E পরীক্ষা
foo বিন্যাস / bar.p0: # ডেটা = পরীক্ষা
foo / bar.p1: # তথ্য = পরীক্ষা # লাইন নম্বর অন্তর্ভুক্ত নেই
zsh% 

1

একটি সহজ এবং আরও মার্জিত সমাধান হ'ল প্রক্রিয়া প্রতিস্থাপন ব্যবহার করা :

grep -E 'regex_here' <( find . -name '*.py')

এটি পাইপের মতো একটি নতুন শেল তৈরি করে না, যার অর্থ আপনি এখনও নিজের আসল শেলটিতে রয়েছেন যেখানে উপনামটি সংজ্ঞায়িত করা হয়েছে, এবং আউটপুট হ'ল আপনি যা চান তা হ'ল।

পুনঃনির্দেশ এবং প্রথম বন্ধনীগুলির মধ্যে কোনও স্থান না রেখে কেবল সাবধান হন, অন্যথায় বাশ একটি ত্রুটি নিক্ষেপ করবে। আমার জ্ঞানের সর্বোপরি, প্রক্রিয়া প্রতিস্থাপনটি বাশ, জেডএস, Ksh {88,93 supported দ্বারা সমর্থিত, তবে পিডিক্স দ্বারা নয় (আমাকে বলা হয়েছে যে এটি এখনও হওয়া উচিত নয় )।


আমার মনে হয় pdksh উন্নয়ন মারা গেছে। মিক্স কমবেশি একটি উত্তরসূরি প্রকল্প - "বেশ শক্ত, এটি দেখা যাচ্ছে (টিজি @ এর মাথায় পার্সিং ধারণাটি করা হয়েছে)"
গিলস 'খারাপ হয়ে যাওয়া বন্ধ করুন'

প্রক্রিয়া প্রতিস্থাপন জটিল findকমান্ডগুলির জন্য একটি ভাল পদ্ধতি , যদিও আপনার সচেতন হওয়া দরকার যে এটি ফাঁকা স্থানগুলিতে ভেঙে যাবে, এবং এটি যতটা সহজেই ঠিক করা যায় find | xargsনা (স্যুইচ করে -print0এবং -0ব্যবহার করে -exec)। প্রযোজ্য হলে, **/সহজ এবং আরও শক্তিশালী।
গিলস 'খারাপ হয়ে যাওয়া বন্ধ করুন'

0

গ্রেপ পরিবেশ পরিবর্তনশীল GREP_OPTIONS থেকে ডিফল্ট বিকল্পগুলির একটি সেট পড়বে। যদি আপনি রাখবেন

 export GREP_OPTIONS='--line-number --color=always'

আপনার .bashrc এ ভেরিয়েবলটি সাব-শেলগুলিতে পাঠানো হবে এবং আপনি প্রত্যাশিত ফলাফল পাবেন get


কিন্তু রাখি না --line-numberবা --color=alwaysGREP_OPTIONSযদি না তা মাত্র এক কমান্ড জন্য, এই স্ক্রিপ্ট অনেকটা ভঙ্গ করবে। --color=autoসেখানে থাকা ঠিক আছে, এবং এটি সব কিছু। আপনার এই লাইনটি রাখলে .bashrcপ্রচুর স্টাফ ভেঙে যায়।
গিলস'স 17- 28 এ

@ গিলস মূল অ্যাকাউন্টের জন্য কোনও কমান্ডের জন্য কোনও এলিয়াস বা ওভাররাইডিং ডিফল্ট বিকল্পগুলি সেট করা একটি খারাপ জিনিস। ব্যবহারকারীর অ্যাকাউন্টের জন্য এই বিকল্পগুলি সেট করা অনেক সমস্যা হওয়ার সম্ভাবনা কম। সমস্যাযুক্ত এমন কোনও ব্যবহারকারীর স্ক্রিপ্ট নিয়ে আমি আসতে পারি না।
didal24

কেবল এমন কোনও স্ক্রিপ্ট যা গ্রাইপ ব্যবহার করে এমনভাবে যা উপস্থিতির উপস্থিতি পরীক্ষার বাইরে চলে যায় তা ভেঙে যায়। উদাহরণস্বরূপ, থেকে /etc/init.d/cronআমার সিস্টেম করুন: value=`egrep "^${var}=" "$ENV_FILE" | tail -n1 | cut -d= -f2` । বা থেকে /usr/bin/pdfjam: pdftitl=`printf "%s" "$PDFinfo" | grep -e … | sed -e …` । স্ক্রিপ্টগুলিতে দেখা যায় না বলে একটি উপাধি কোনও সমস্যা নয়।
গিলস 'অশুভ হওয়া বন্ধ করুন'

@ গিলস আমি এই জাতীয় অনেক স্ক্রিপ্ট সম্পর্কে সচেতন। আমি যেগুলি পেতে পারি না সেগুলি সাধারণত মূল দ্বারা চালিত হয় (যেমন /etc/init.d/cron)। ব্যক্তিগতভাবে, আমার ব্যবহারকারীর অ্যাকাউন্টগুলিতে আমার কোনও উপাত্ত সংজ্ঞায়িত করা হয়নি বা কমান্ডের ডিফল্ট আচরণকে ওভাররাইড করার জন্য কোনও আরসি ফাইল বা পরিবেশের ভেরিয়েবলের মাধ্যমে বিকল্পগুলি সেট করি না। আমি সুবিধার চেয়ে অনুমানযোগ্যতা পছন্দ করি।
didal24

স্ক্রিপ্টগুলি দেখা না হওয়ার কারণে উপাধিগুলি অনুমানযোগ্যতা ভঙ্গ করে না। সেট GREP_OPTIONSবিরতি ভবিষ্যদ্বাণীর খুব খারাপভাবে মত কয়েকটি অপশন ব্যতীত --color=auto(যা কি এটা জন্য পরিকল্পনা করা হয়েছিল যায়)।
গিলস 'অশুভ হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.