পাইপ থেকে ট্যারে তবে -v ভার্বোস আউটপুটটি STDERR থেকে পৃথক রাখুন


12

একটি সাধারণ টার কমান্ড

tar cvf foo.tar ./foo >foo.out 2>foo.err

তিনটি আউটপুট আইও স্ট্রিম রয়েছে

  • foo.tar থেকে সংরক্ষণাগার ডেটা
  • STDOUT এ ফাইলের নামের তালিকা (foo.out এ পুনঃনির্দেশিত)
  • STDERR এ ত্রুটি বার্তা (foo.err এ পুনঃনির্দেশিত)

তারপরে আমি ফাইল নামগুলির তালিকা না পড়েই ত্রুটি বার্তাগুলির জন্য foo.err পরিদর্শন করতে পারি।

আমি যদি সংরক্ষণাগার ডেটা (নেটট্যাট বা একটি বিশেষ সংক্ষেপণ প্রোগ্রামের মাধ্যমে পাইপ) দিয়ে কিছু করতে চাই তবে আমি টারের -f -বিকল্পটি এইভাবে ব্যবহার করতে পারি

tar cvf - ./foo 2>foo.err | squish > foo.tar.S

তবে এখন আমার ফাইলের নামের তালিকাটি আমার ত্রুটি বার্তাগুলির সাথে মিশ্রিত হয়েছে কারণ টারের -vআউটপুট স্পষ্টতই STDOUT এ যেতে পারে না (যেখানে আর্কাইভের ডেটা প্রবাহিত হয়) তাই তার পরিবর্তে তার চালক STTERR তে চালাকভাবে লেখেন।

কর্ন শেল ব্যবহার করে, একটি কমান্ড তৈরির উপায় রয়েছে যা সংরক্ষণাগার প্রবাহকে অন্য কমান্ডে পাইপ দেয় তবে এখনও -vকোনও ত্রুটি বার্তাগুলি থেকে আউটপুট আলাদাভাবে ক্যাপচার করে ।


আপনি কি সাথে পরিচিত tee? এটি এটির জন্য বেশ কার্যকর বৈধ ব্যবহারের মতো বলে মনে হচ্ছে।
HalosGhost

উত্তর:


9

যদি আপনার সিস্টেম সমর্থন করে /dev/fd/n:

tar cvf /dev/fd/3 ./foo 3>&1 > foo.out 2>foo.err | squish > foo.tar.S

যা প্রক্রিয়া বিকল্প ব্যবহার করে আপনি লিখতে পারেন ksh(বা bashবা zsh) এর এটিএন্ডটি বাস্তবায়নের সাথে :

tar cvf >(squish > foo.tar.S) ./foo > foo.out 2>foo.err

এবার ঠিক একই জিনিসটি বাদ দিলে শেলটি সিদ্ধান্ত নেয় যে কোন ফাইল বর্ণনাকারীর পরিবর্তে 3(সাধারণত 9 এর উপরে) ব্যবহার করা উচিত। আর একটি পার্থক্য হ'ল এবার, আপনি এর tarপরিবর্তে প্রস্থান স্থিতি পাবেন squish। যেসব সিস্টেম সমর্থন করে না /dev/fd/n, সেগুলিতে কিছু শাঁস সেই বৈশিষ্ট্যের জন্য নামযুক্ত পাইপগুলিকে অবলম্বন করতে পারে।

যদি আপনার সিস্টেম সমর্থন করে না /dev/fd/nবা আপনার শেল তার প্রক্রিয়া বিকল্পের জন্য নামযুক্ত পাইপগুলি ব্যবহার করতে না পারে, তবে এটিই আপনার হাতে নামযুক্ত পাইপগুলি মোকাবেলা করতে হবে


6

তার জন্য আপনাকে একটি নামক পাইপ ব্যবহার করতে হবে।

প্রথমে ফোল্ডারে একটি তৈরি করুন:

mkfifo foo.pipe

তারপরে এই কমান্ডটি ব্যবহার করুন:

tar cvf foo.pipe ./foo >foo.out 2>foo.err & cat foo.pipe >foo.tar

বিজ্ঞপ্তি:cat -part, এখন হতে পারে gzipবা যাই হোক না কেন, যে একটি নল থেকে পড়তে পারেন:

tar cvf foo.pipe ./foo >foo.out 2>foo.err & gzip -c foo.pipe >foo.tar

ব্যাখ্যা:

আউটপুট নাম নল (লেখা হয় foo.pipe), যেখানে অন্য আটকায় ( cat, gzip, netcat) থেকে পড়া হয়। সুতরাং আপনি তথ্যের জন্য stdout / stderr চ্যানেলগুলি looseিলা করবেন না।


1
একটি নামক পাইপ ব্যবহারের প্রভাবগুলি লক্ষ করার মতো হতে পারে । 1) umask 077এটির অন্যান্য প্রক্রিয়াগুলি পড়া বা লেখা রোধ করতে একটি (বা একটি প্রাইভেট টেম্প ডির ব্যবহার) নির্ধারণ করা ভাল (অনেকগুলি সিস্টেমে, পাইপের নামকরণ করা, যেমন অন্যান্য ফাইলগুলি ডিফল্টরূপে বিশ্ব-পঠনযোগ্য তৈরি করা হয়), ২) আপনাকে অবশ্যই নিশ্চিত করতে হবে নামক পাইপটি কেবলমাত্র আপনার স্ক্রিপ্টের প্রতিটি ক্ষেত্রেই ব্যবহৃত হয় (আবার একটি অফ-বেসরকারী অস্থায়ী ডিরেক্টরি সাহায্য করে) 3) এর অর্থ আপনার পরে পরিষ্কার করা বা বাধা দেওয়া থাকলে প্রয়োজন।
স্টাফেন চেজেলাস

1
+1 - আমি এই উত্তরটি পছন্দ করি। দুর্ভাগ্যক্রমে আমার জন্য, আমার (পুরানো) সিস্টেমে নামক পাইপগুলির মধ্যে কিছু অদ্ভুততা রয়েছে যা আমি যখন চেষ্টা করি তখন সেগুলি অবিশ্বাস্য করে তোলে।
রেডগ্রিটিব্রিক

1
@ স্টাফেনচেজেলাস - আমি মনে করি মাঝে মাঝে প্রথমে পরিষ্কার করা সহজ হতে পারে, যেমন:p="/tmp/pipe$$"; mkfifo "$p"; (read na; cmd[s]...) <>"$p" & (echo;rm "$p"; cmd[s]...) >"$p"
মাইক্রোসার্ক

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