এক প্রক্রিয়া থেকে অন্য প্রক্রিয়াতে আউটপুট পাইপ করা যায় তবে প্রথমটিতে যদি আউটপুট থাকে তবে কেবল কার্যকর করা যায়?


23

যদি কেবলমাত্র ইমেলটিতে এই আউটপুট থেকে থাকে তবে আমি কীভাবে এই আদেশটি পুনরায় লিখতে পারি mailq | grep?

mailq | egrep 'rejected|refused' -A 5 -B 5 | mail -s 'dd' email@email

এটি কি এক লাইনেও সম্ভব?

পাইপ খালি কিনা তা পরীক্ষা করে দেখুন এবং ইমেল প্রেরণের চেয়ে আরও সাধারণ ক্ষেত্রে না থাকলে ডেটাতে একটি কমান্ড চালান


উত্তর:


19

আমি মনে করি আপনাকে এই অপারেশনের জন্য একটি টেম্প ফাইল ব্যবহার করতে হবে যাতে &&গ্রাইপ একটি প্রস্থান স্থিতি ফিরিয়ে দেয় যদি গ্রীপটি এর মতো মিল রয়েছে:

TMPFILE=`mktemp /tmp/mailqgrep.XXXXXX`; mailq | egrep 'rejected|refused' -A5 -B5 > "$TMPFILE" && mail -s 'dd' email@email < "$TMPFILE"; rm "$TMPFILE"

যদি আপনি কোথাও কোথাও টেম্প্প ফাইলটি আঁকড়ে ধরতে আপত্তি না করেন এবং এর জন্য কোনও স্থির নাম ব্যবহার করতে পারেন তবে আপনি বিশেষ নামকরণ এবং মোছার জিনিসটি এড়িয়ে যেতে পারেন:

 mailq | egrep 'rejected|refused' -A5 -B5 > /tmp/mailqgrep && mail -s 'dd' email@email < /tmp/mailqgrep

সম্পাদনা: গ্লেনের উত্তর দেখার পরে আমি এটির সাথে আরও কিছু খেললাম এবং স্পষ্টতই $()সিনট্যাক্স ব্যবহার করে একটি ভেরিয়েবল বরাদ্দ করালে কমান্ডের প্রস্থান কোডটি ফিরে আসে, সুতরাং আপনি স্ট্রিংয়ের দৈর্ঘ্যের জন্য যে পরীক্ষাটি ব্যবহার করেছিলেন তা এড়িয়ে যেতে পারেন এবং পরিবর্তে এটি ব্যবহার করতে পারেন। এখানে এটি সমস্তই এক আদেশে রয়েছে:

data=$(mailq | egrep 'rejected|refused' -A 5 -B 5) && mail -s 'dd' email@email <<< "$data"

সম্পাদনা 2: সাইমন এর উত্তর দেখার পরে আমি আমার mailপ্রোগ্রাম চেক আউট । এটি ডিফল্টরূপে তিনি যেভাবে বর্ণনা করেছেন সেভাবে আচরণ করে না তবে এর জন্য একটি বিকল্প রয়েছে। ম্যান পৃষ্ঠা থেকে:

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

এটি সম্ভব করে তোলা:

mailq | egrep 'rejected|refused' -A 5 -B 5 | mail -E -s 'dd' email@email

1
সহযোগিতার শক্তি !!
গ্লেন জ্যাকম্যান

3
আমি পরামর্শ দিচ্ছি যে সেরা সমাধানটিকে শীর্ষে নিয়ে গিয়ে এই উত্তরটি আরও ভাল করা যায়।
মার্ক বুথ

@ উইল্ডকার্ড যে সম্পাদনাটি অপ্রয়োজনীয় ছিল, প্রদত্ত ইনপুট প্যারামিটারগুলি mktempএমন কোনও কিছু ফিরিয়ে দেবে না যার উদ্ধৃতি দরকার।
কালেব

2
আমি জানি. আপনি কয়েক যারা বুঝতে পেরেছিল যে উদ্ধৃতি বিরক্তির এক হয় কখনও কখনও প্রয়োজনীয় (এবং তাদের ইচ্ছাকৃতভাবে বাদ)। তবে, আপনি স্পষ্টভাবে কল করতে না চাইলে ডিফল্টটিকে উদ্ধৃত করা উচিতglob(split(var)) । আপনার এখানে শব্দ বিভাজন বা ফাইল গ্লোব সম্প্রসারণের প্রয়োজন নেই, তাই তাদের জন্য জিজ্ঞাসা করবেন না। এছাড়াও, আমাদের এই সাইটে সঠিক উপায়টি দেখাতে হবে
ওয়াইল্ডকার্ড

@ উইল্ডকার্ড ফেয়ার যথেষ্ট। আমি সাধারণত চালানো zshএবং আসলে করছি না ভালো ক্ষেত্রেই globbing বা ওয়ার্ড বিভাজন পেয়ে যদি না আমি তাদের জন্য জিজ্ঞাসা, কিন্তু লক্ষ্য পরিবেশ নীতি থেকে বেরিয়ে উদ্ধৃত বুদ্ধিমান জরিমানা উত্তর অনুরোধে এখানে এবং না করার জন্য।
কালেব

11

ইউটিলিটি প্রোগ্রাম ifne এই উদ্দেশ্যে স্পষ্টভাবে উপস্থিত রয়েছে: স্ট্যান্ডার্ড ইনপুট ফাঁকা না থাকলে একটি কমান্ড চালানো।

mailq | egrep 'rejected|refused' -A 5 -B 5 | ifne mail -s 'dd' email@email

Ifne কমান্ডটি মুরতাদির প্যাকেজের অংশ , "ইউনিক্স সরঞ্জামগুলির একটি ক্রমবর্ধমান সংগ্রহ যা ইউনিক্স যুবক যখন লেখার জন্য খুব বেশি আগে কেউ ভাবেননি।"


8

আপনি আউটপুটটি একটি ভেরিয়েবলে সংরক্ষণ করতে পারেন, এবং তারপরে স্ট্রিংয়ের দৈর্ঘ্য শূন্য না থাকলে মেল কমান্ডটি আবেদন করতে পারেন।

data=$(mailq | egrep 'rejected|refused' -A 5 -B 5)
[[ -n "$data" ]] && mail -s 'dd' email@email <<< "$data"

একটি লাইনের জন্য, দুটি কমান্ডকে একটি আধা-কোলনের সাথে যুক্ত করুন।


1
একটি অস্থায়ী ফাইলের পরিবর্তে ভেরিয়েবল ব্যবহারের জন্য প্রপস। আপনি যে ভেরিয়েবল অ্যাসাইনমেন্টটি দিয়েছিলেন সেই নির্দেশ থেকে প্রস্থান কোডটি কোথায় যায় সে সম্পর্কে এটি আমাকে ভাবতে পেরেছিল এবং স্পষ্টতই এটি পাস হয়ে যায়! আমার আপডেট হওয়া উত্তরটি দেখুন
কালেব

7

ব্যবহার করুন mailসঙ্গে -Eবিকল্প। আমার ম্যাক-এ, মেল (1) জানায় যে -Eপতাকাটি খালি শরীরের সাথে ইমেল প্রেরণ করবে না।

- আমরা খালি শরীরের সাথে বার্তা প্রেরণ করব না। ক্রোন (8) স্ক্রিপ্ট থেকে ত্রুটিগুলি পাইপ করার জন্য এটি দরকারী।

আমার ম্যাকে, আমি নিম্নলিখিত পরীক্ষায় অংশ নিয়েছি। নোট করুন যে ফাইলটি file_does_existবিদ্যমান, কিন্তু ফাইলটি file_does__not_existবিদ্যমান নেই।

এটি আমাকে একটি ইমেল প্রেরণ করে:

$ ls file_does_exist | egrep 'file' -A5 -B5 | mailx -E -s 'test' stefan@example.org

এটা না। লক্ষ্য করুন যে কমান্ডটি ls file_does_not_exist | egrep ...কোনও আউটপুট দেয় না।

$ ls file_does_not_exist | egrep 'file' -A5 -B5 | mailx -E -s 'test' stefan@example.org
ls: file_does_not_exist: No such file or directory

কালেব তোমাকে এতে মারধর করেছে।
গিলস 'অসন্তুষ্ট হওয়া বন্ধ করুন'

1
তিনি আমাকে কেবল 4.75 ঘন্টা দ্বারা প্রহার করেছেন :) :) তাঁর দীর্ঘ উত্তরে আমি এই বিশদটি মিস করেছি।
স্টিফান লাসিউস্কি

5

এই বিশেষ ক্ষেত্রে, যদি আপনার বিকল্পটি mailসমর্থন করে তবে-E কেবল এটি ব্যবহার করুন। সাধারণ ক্ষেত্রে, আপনি একটি অক্ষর পড়ার চেষ্টা করতে পারেন; যদি একটি থাকে তবে পোস্ট প্রসেসিং কমান্ডটি শুরু করুন এবং এটিকে অক্ষরের সাথে বাকী ফাইলটি ফিড করুন।

pipe_if_not_empty () {
  a=$(dd bs=1 count=1 2>/dev/null; echo .)  # read at most one character
  if [ "$a" != "." ]; then                  # if there were two characters,
    { printf %s "${a%.}";                   # then output the first character
      cat; } |                              # and the rest of the input   
    "$@"                                    # into the specified program
  fi
}

mailq | egrep 'rejected|refused' -A 5 -B 5 |
pipe_if_not_empty mail -s 'dd' email@email

এর দরকারী ব্যবহারটি নোট করুন cat। যোগে echo .তোলে এই ফাংশন কাজ এমনকি যদি ইনপুট প্রথম অক্ষরের একটি newline আছে (মনে রাখবেন যে $(…)কনস্ট্রাক্ট টার্মিনাল নতুন লাইন রেখাচিত্রমালা)।

বেশিরভাগ শাঁস (zsh ব্যতীত অন্য যে কোনও বিষয়, যতদূর আমি জানি) দিয়ে, যদি ফাইলটি নাল অক্ষর দিয়ে শুরু হয়, এই কোডটি খালি মনে করবে। এটি পাঠকের জন্য অনুশীলন হিসাবে রেখে দেওয়া হয়েছে। (ইঙ্গিত: odপ্রথম সাবশেলে ব্যবহার করুন এবং printfপ্রথম বাইটটি মুদ্রণ করুন।) সমাধান: পাইপ খালি রয়েছে কিনা তা পরীক্ষা করতে পারেন ) যদি ফাইলটি কোনও বাইট দিয়ে শুরু হয় যা বর্তমান বৈধ অক্ষর নয় You লোকেল; এই কোডটি দিয়ে চালিয়ে এটি ঠিক করা সহজ LC_ALL=C


হাস্যকর জন্য সম্ভবত +1 তবে অন্য দৃশ্যে সম্ভবত কার্যকর :) কৌতূহলের বাইরে, খালি স্ট্রিংয়ের জন্য পরীক্ষার পরিবর্তে কেন বিন্দুর জন্য ইনজেকশন এবং পরীক্ষা করা হবে? যদি কোনও ডট দিয়ে ইনপুট শুরু হয় তবে সমস্যাটি পরিচয় করে না? readএই সহজ করতে সাহায্য ব্যবহার করতে পারেন?
কালেব

@ কালেব: হ্যাঁ, আমার উল্লেখ করা উচিত ছিল যে আমি শিরোনামে প্রশ্নের উত্তর দিচ্ছি, বিশেষ পরিস্থিতির দিকে নয়। বিন্দুর ব্যাখ্যার জন্য আমার সম্পাদনা দেখুন। আমি মনে করি না যে আপনি একটি খালি ফাইল থেকে readপোর্টেবল শের সাথে একটি ফাঁকা প্রথম লাইনটি আলাদা করতে পারবেন (এটি ব্যাশ, কেএসএস বা জেডএসে হতে পারে)।
গিলস 'অশুভ হওয়া বন্ধ করুন'

3

আইআইআরসি বিএসডি mailকমান্ড একটি খালি বার্তা দিলে বাতিল করে দেয়।


1
আমার গনুহ লিনাক্স সিস্টেমে মেইল প্রোগ্রাম (heirloom mailx 12.4) ডিফল্টভাবে এইরকম আচরণ করে না, কিন্তু আছে একটি -Eএটি সক্রিয় করতে বিকল্প
কালেব

1

সম্প্রতি আমি কমান্ডের নামটি শিখেছি ifneযা moreutilsপ্যাকেজের অংশ । আপনি এই নির্দিষ্ট সমস্যাটি সমাধান করতে এটি কোথায় ব্যবহার করতে পারেন।

ifne - স্ট্যান্ডার্ড ইনপুট ফাঁকা না থাকলে কমান্ড চালান

ম্যান পৃষ্ঠা থেকে উদাহরণ,

EXAMPLE
       find . -name core | ifne mail -s "Core files found" root

0

অংশ test -s /dev/stdinথেকে কোনও আউটপুট আছে কিনা তা পরীক্ষা করে আপনি আপনার কমান্ডটি পুনরায় লিখতে পারেন mailq | grep

- mailq | egrep 'rejected|refused' -A 5 -B 5 | mail -s 'dd' email@email
+ mailq | egrep 'rejected|refused' -A 5 -B 5 | (test -s /dev/stdin && cat) | mail -s 'dd' email@email
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.