গ্রেপ ওরফে - লাইন নম্বর যদি না এটি পাইপলাইন থাকে


25

আমি গ্রেপের জন্য একটি বাশ ওরফে তৈরি করতে চাই যা লাইন নম্বর যুক্ত করে:

alias grep='grep -n'

তবে এটি অবশ্যই পাইপলাইনে লাইন নম্বর যুক্ত করে। বেশিরভাগ সময় (এবং কোনও ব্যতিক্রম মাথায় আসে না) আমি পাইপলাইনের মধ্যে লাইন নম্বর চাই না (কমপক্ষে অভ্যন্তরীণভাবে, সম্ভবত এটি শেষ হলে ঠিক আছে), এবং আমি সত্যিই কোনও সেড / অ্যাজক / কাট যুক্ত করতে চাই না পাইপলাইন কেবল তাদের বাইরে নিতে।

সম্ভবত আমার প্রয়োজনীয়তাগুলি "গ্রেপ লাইনের একমাত্র কমান্ড হলে কেবল লাইন সংখ্যা যুক্ত করতে" সরল করা যেতে পারে। কোনও বিশেষভাবে কুৎসিত ওরফে ছাড়া এটি করার কোনও উপায় আছে কি?

উত্তর:


27

আপনি ব্যাশে (বা কোনও পসিক্স শেল) এর মতো কোনও ফাংশন ব্যবহার করতে পারেন:

grep() { 
    if [ -t 1 ] && [ -t 0 ]; then 
        command grep -n "$@"
    else 
        command grep "$@"
    fi
}

[ -t 1 ]অংশ ব্যবহার [কমান্ড (নামেও পরিচিত test) যদি stdout- এ একটি TTY সঙ্গে যুক্ত করা হয় বার করো।

[ -t 0 ]চেক স্ট্যান্ডার্ড ইনপুট, পাশাপাশি, যেহেতু আপনি শুধুমাত্র রেখা নম্বর যুক্ত করতে যদি নির্দিষ্ট grepহয় শুধুমাত্র পাইপলাইন কমান্ড।


5
আর পরীক্ষা করা [[ -t 0 && -t 1 ]]আপনি শুধুমাত্র লাইন সংখ্যা চান তাহলে উভয় মান ইনপুট এবং মান আউটপুট টার্মিনাল সাথে সংযুক্ত।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

3

(সম্পূর্ণতার জন্য)

যদিও @ enzotib এর উত্তর সম্ভবত আপনি যা চান তা হয়, এটা আপনার জন্য কি জিজ্ঞাসা না। [ -t 1 ]ফাইল বিবরণকারীটি একটি টার্মিনাল ডিভাইস কিনা তা পরীক্ষা করে, এটি কোনও পাইপ ব্যতীত অন্য কিছু নয় (নিয়মিত ফাইল, সকেট, অন্য ধরণের ডিভাইসের মতো /dev/null...)

[কমান্ডের কি কোন সমতুল আছে -tকিন্তু পাইপ জন্য। কোনও ফাইল বর্ণনাকারীর সাথে যুক্ত ফাইলের ধরণটি পেতে, আপনাকে fstat()এটিতে সিস্টেম কল করতে হবে। এটি করার জন্য কোনও মানক কমান্ড নেই, তবে কিছু সিস্টেম বা শেলগুলির কিছু রয়েছে।

জিএনইউ সহ stat:

grep() {
  if { [ "$(LC_ALL=C stat -c %F - <&3)" = fifo ]; } 3>&1 ||
     [ "$(LC_ALL=C stat -c %F -)" = fifo ]; then
    command grep "$@"
  else
    command grep -n "$@"
  fi
}

অথবা এর সাথে zshএবং এর নিজস্ব statবিল্টিন (যা কয়েক বছরের মধ্যে জিএনইউর একটিকে পূর্বাভাস দেয়) এখানে zstatকেবলমাত্র লোড হয়েছে :

grep() {
  zmodload -F zsh/stat b:zstat
  local stdin_type stdout_type
  if zstat -A stdin_type -s -f 0 +mode &&
     zstat -A stdout_type -s -f 1 +mode &&
     [[ $stdin_type = p* || $stdout_type = p* ]]
  then
     command grep "$@"
  else
     command grep -n "$@"
  fi
}

এখন কয়েকটি নোট:

এটি কেবল শেল পাইপলাইনই নয় যা পাইপ ব্যবহার করে।

var=$(grep foo bar)

বা:

cmd <(grep foo bar)

বা:

coproc grep foo bar

এছাড়াও grepতার স্টাডাউট একটি পাইপ যেতে চালানো ।

যদি আপনার শেলটি থাকে তবে ksh93মনে রাখবেন যে কয়েকটি সিস্টেমে এটি তার পাইপলাইনে পাইপের পরিবর্তে সকেটপেইস ব্যবহার করে।

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