কীভাবে একাধিক লগ ফাইলগুলিতে আউটপুট পুনর্নির্দেশ করা যায়


52

একাধিক লগ ফাইলগুলিতে স্ট্যান্ডার্ড আউটপুট পুনঃনির্দেশ কিভাবে করবেন? নিম্নলিখিতগুলি কাজ করে না:

some_command 1> output_log_1 output_log_2 2>&1

6
সাথে zsh, আপনি ব্যবহার করতে পারেন some_command >output_log_1 >output_log_2
জোফেল

উত্তর:


70

দেখুন man tee:

NAME: টি - স্ট্যান্ডার্ড ইনপুট থেকে পড়ুন এবং স্ট্যান্ডার্ড আউটপুট এবং ফাইলগুলিতে লিখুন

স্নোপিসিস: টি [বিকল্প] ... [ফাইল] ...

তদনুসারে:

echo test | tee file1 file2 file3

স্ট্যাডারকে কি একাধিক ফাইলে পুনঃনির্দেশ করা যায়?
fromnaboo

হ্যাঁ, এটি পুনঃনির্দেশের গুণাবলী দ্বারা করা যেতে পারে: </ -name পরীক্ষা 2> & 1 | সন্ধান করুন tee file1 file2 file3
akond

@ কেন্ড, cmd 2>&1 | tee log1 log2 আমি উপরের মতো কার্যকর করার চেষ্টা করেছি, তবে এটি দ্বিতীয় লগ ফাইলটিতে পুনর্নির্দেশের জন্য আমার সিআরটিএল -সি টিপতে হবে। এছাড়াও আউটপুট কনসোলে মুদ্রিত হয়। আমি চাই কমান্ড আউটপুটটি লগগুলিতে পুনঃনির্দেশিত করা উচিত তবে কনসোলে নয়। কোন সাহায্য প্রশংসা করা হয়।
ডাবলডেকার

@doubledecker teeকমান্ড লিখেছেন stdinদায়ের করতে (গুলি) এবং এছাড়াও থেকে stdout। আপনি যদি আউটপুটটি টার্মিনালে প্রদর্শিত না চান তবে /dev/nullআপনাকে সাধারণত পছন্দ করতে আপনাকে পুনর্নির্দেশ করতে হবে।
Minix

4
একাধিক ফাইলগুলিতে সংযোজন করাও সম্ভব:echo test | tee --append file1 file2
ব্যবহারকারী 1364368

13

ধরা যাক আপনার আউটপুট একটি ফাংশন থেকে উত্পন্ন হয়েছে cmd():

cmd() {
    echo hello world!
}

cmdদুটি ফাইল থেকে আউটপুট পুনর্নির্দেশ করতে, তবে কনসোলে নয়, আপনি ব্যবহার করতে পারেন:

cmd | tee file1 file2 >/dev/null

এটি একাধিক ফাইলের জন্য কাজ করবে, যে কোনও উপাত্ত উত্স পাইপিংয়ের জন্য দেওয়া:

echo "foobarbaz" | tee file1 file2 file3 file4 > /dev/null

এটিও কাজ করবে:

echo $(cmd) | tee file1 file2 >/dev/null

/dev/nullপুনঃনির্দেশ ছাড়াই , টি নির্দিষ্ট ফাইলগুলি ছাড়াও স্টডআউটে আউটপুট প্রেরণ করবে ।

উদাহরণস্বরূপ, এটি কনসোল থেকে চালিত হলে আপনি সেখানে আউটপুট দেখতে পাবেন। কোনও ক্রন্টব থেকে চালানো, আউটপুটটি স্থিতি বার্তা উপস্থিত হবে যা আপনাকে প্রেরণ করা হয়েছে (গিলসের উত্তরটি এখানে https://unix.stackexchange.com/a/100833/3998 দেখুন )।

এটি আমার জন্য উবুন্টু 12.04-এ বাশে কাজ করেছে এবং জিএনইউ ব্যাশ 4.3.11 (1) ব্যবহার করে উবুন্টু 14.04 এ যাচাই করা হয়েছে, সুতরাং এটি কোনও সাম্প্রতিক জিএনইউ বাশ সংস্করণে কাজ করা উচিত।


@ ডাবলডেকার - দেখে মনে হচ্ছে এটি আপনার শর্তগুলি সন্তুষ্ট করে, তাই উত্তর হিসাবে গ্রহণ করা যেতে পারে। এছাড়াও, version 4.3.11(1)-release (i686-pc-linux-gnu)উবুন্টু 14.04-তে GNU বাশ ( ) এর অধীনে আমি এটি পরীক্ষা করেছি ।
বেলাকোয়া

9

এটি একটি পুরানো পোস্ট তবে আমি এখনই এটি খুঁজে পেয়েছি ...

আউটপুট আপনাকে পুনর্নির্দেশের পরিবর্তে > /dev/nullএটি শেষ ফাইলে পুনর্নির্দেশ করতে পারে:

echo "foobarbaz" | tee file1 > file2

অথবা আউটপুট সংযোজনের জন্য:

echo "foobarbaz" | tee -a file1 >> file2

এটি কম-বেশি যা অন্য উত্তর বলেছে (টি বাদে -a )
আর্চেমার

এই পথেই যেতে হবে।
71GA

5

@ জোফেল উত্তরের মন্তব্যে যেমন উল্লেখ করেছেন, এটি স্থানীয়ভাবে করা যেতে পারে zsh:

echo foobar >file1 >file2 >file3

বা, ব্রেস প্রসারিত সহ:

echo foobar >file{1..3}

অভ্যন্তরীণভাবে এটি teeউপরে প্রদত্ত উত্তরের সাথে একইভাবে কাজ করে । শেল কমান্ডের স্টডআউটকে এমন একটি প্রক্রিয়ার সাথে সংযুক্ত করে যা একাধিক ফাইলগুলিতে পাইপ দেয়; অতএব, এইভাবে এটি করার কোনও বাধ্যতামূলক প্রযুক্তিগত সুবিধা নেই (তবে এটি সত্যই ভাল দেখাচ্ছে)। আরও জন্য zshম্যানুয়াল দেখুন।


2

মন্তব্য করতে অক্ষম, তবে, প্রকাশ করার অন্য একটি উপায়

echo "foobarbaz" | tee file1 file2 file3 file4 file5 file6 file7 file8 > /dev/null

অনেকগুলি ফাইলের সাথে ডিল করার সময় এটিতে সহজ করা যায় Could

echo "foobarbaz" | tee file{1..8} > /dev/null

2
ইতিমধ্যে দেওয়া অন্যান্য উত্তরগুলির থেকে এটি কীভাবে আলাদা? বিশেষ করে যেহেতু কম লোকই সম্ভবত আক্ষরিক চান file1মাধ্যমে file8তাদের নাম এবং ঐ ফাইল নামের জন্য সম্ভবত মাত্র উদাহরণ প্লেসহোল্ডার হয়
এরিক Renouf

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