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


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.