কিভাবে একটি ফাইল এবং স্টডআউট আউটপুট পুনর্নির্দেশ


988

ব্যাশে, কলিং fooস্ট্যান্ডআউটে সেই আদেশ থেকে যে কোনও আউটপুট প্রদর্শন করবে।

কলিং foo > outputসেই আদেশ থেকে যে কোনও আউটপুট নির্দিষ্ট ফাইলটিতে পুনর্নির্দেশ করবে (এই ক্ষেত্রে 'আউটপুট')।

কোনও ফাইলে আউটপুট পুনর্নির্দেশ করার কোনও উপায় আছে এবং এটি স্টডআউটে প্রদর্শিত হবে?


3
যদি কেউ এখানেই ফাইলের জন্য ত্রুটি আউটপুট ক্যাপচারের জন্য সন্ধান করে শেষ হয়েছে তবে একবার দেখুন - unix.stackexchange.com/questions/132511/…
মার্ফি

2
পরিভাষা একটি নোট: আপনি যখন চালানো foo > outputডেটা হয় stdout- এ এবং stdout- এ লেখা হয় নামের ফাইল output। অর্থাৎ ফাইলে লেখা হয় stdout- এ লেখা। আপনি জিজ্ঞাসা করছেন stdout এবং টার্মিনাল উভয়ই লেখা সম্ভব কিনা?
উইলিয়াম পার্সেল

2
@ উইলিয়ামপ্রেসেল আমি নিশ্চিত নই যে আপনার স্পষ্টকরণের কারণে জিনিসগুলির উন্নতি ঘটে :-) এটি সম্পর্কে: ওপি জিজ্ঞাসা করছে যে কোনও প্রোগ্রাম এবং কলিং প্রোগ্রামের স্টাডআউট উভয়ের দিকে কথিত প্রোগ্রামের স্টাডাউটকে নির্দেশ দেওয়া সম্ভব (পরবর্তীকালে স্টাডআউট যা বলা প্রোগ্রাম হবে) বিশেষ কিছু না করা হলে উত্তরাধিকারী হও; যেমন টার্মিনাল, যদি কলিং প্রোগ্রামটি ইন্টারেক্টিভ বাশ সেশন হয়)। এবং সম্ভবত তারা একইভাবে ডাকা প্রোগ্রামটির স্টারারকেও নির্দেশ করতে চায় ("সেই আদেশ থেকে কোনও আউটপুট" স্টারডার সহ অর্থ যুক্তিসঙ্গতভাবে ব্যাখ্যা করা যেতে পারে)।
ডন হ্যাচ

উত্তর:


1376

আপনি যে আদেশটি চান তা নাম দেওয়া হয়েছে tee:

foo | tee output.file

উদাহরণস্বরূপ, আপনি যদি কেবল স্টডআউট সম্পর্কে যত্নবান হন:

ls -a | tee output.file

আপনি যদি স্ট্যাডারকে অন্তর্ভুক্ত করতে চান তবে করুন:

program [arguments...] 2>&1 | tee outfile

2>&1চ্যানেল 2 (স্টার্ডার / স্ট্যান্ডার্ড ত্রুটি) কে চ্যানেল 1 (স্টাডাউট / স্ট্যান্ডার্ড আউটপুট) এ পুনঃনির্দেশ করে, যেমন উভয়ই স্টডআউট হিসাবে লেখা হয়। এটি teeকমান্ড হিসাবে প্রদত্ত আউটপুট ফাইলের দিকেও নির্দেশিত হয় ।

তদ্ব্যতীত, আপনি যদি লগ ফাইলটিতে যুক্ত করতে চান তবে এটি ব্যবহার করুন tee -a:

program [arguments...] 2>&1 | tee -a outfile

173
যদি ওপি "সমস্ত আউটপুট" পুনঃনির্দেশিত করতে চায় তবে আপনাকে স্ট্যাডারও ধরতে হবে: "ls -lR / 2> & 1 | টি আউটপুট.ফাইল"
জেমস ব্র্যাডি

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

3
আহ দুঃখিত, আমি কিছুটা বিভ্রান্ত হয়ে থাকতে পারি। যখন আমি এটি চেষ্টা করেছিলাম তখনই আমি কোনও আউটপুট পাইনি, সম্ভবত এটি সমস্ত স্ট্যাডারে চলেছে।
evanmcdonnal

38
এটিকে ওভাররাইট করার পরিবর্তে সামগ্রী যুক্ত -aকরার teeজন্য যুক্তিটি ব্যবহার করুন output.file:ls -lR / | tee -a output.file
কাজী

16
আপনি যদি $?পরে ব্যবহার করেন তবে এটির স্থিতি কোডটি ফিরিয়ে দেবে tee, যা সম্ভবত আপনি চান তা নয়। পরিবর্তে, আপনি ব্যবহার করতে পারেন ${PIPESTATUS[0]}
লাগাউট 14

501
$ program [arguments...] 2>&1 | tee outfile

2>&1stderr এবং stdout স্রোত ডাম্প। tee outfileযে স্ট্রিমটি পায় সেটি নিয়ে যায় এবং এটি স্ক্রিনে এবং "আউটফিল" ফাইলটিতে লেখেন।

বেশিরভাগ লোকেরা সম্ভবত এটিই সন্ধান করছেন। সম্ভবত কিছু পরিস্থিতি হ'ল কিছু প্রোগ্রাম বা স্ক্রিপ্ট দীর্ঘ সময় ধরে কঠোর পরিশ্রম করছে এবং প্রচুর আউটপুট তৈরি করছে। ব্যবহারকারী এটি পর্যায়ক্রমে অগ্রগতির জন্য যাচাই করতে চান, তবে কোনও ফাইলের কাছে আউটপুটও লেখা চায়।

সমস্যা (বিশেষত স্ট্ডআউট এবং স্টডার স্ট্রিমগুলির মিশ্রণের সময়) প্রোগ্রামটি প্রবাহিত হওয়া স্ট্রিমগুলির উপর নির্ভরতা রয়েছে। যদি উদাহরণস্বরূপ, stdout- এ সব লিখেছেন করছে না রাঙা কিন্তু stderr হবে সব লিখেছেন হয় রাঙা, তারপর তারা আউট আউটপুট ফাইল এবং পর্দায় কালানুক্রমিকভাবে শেষ করব।

প্রোগ্রামটি অগ্রগতি রিপোর্ট করার জন্য প্রতি কয়েক মিনিটের মধ্যে কেবল 1 বা 2 লাইন আউটপুট দিলে এটিও খারাপ। এই জাতীয় পরিস্থিতিতে যদি আউটপুটটি প্রোগ্রামটি দ্বারা সজ্জিত না করা হয়, ব্যবহারকারী এমনকি কয়েক ঘন্টা পর্দায় কোনও আউটপুটও দেখতে পাবেন না কারণ এর কোনও কিছুই পাইপের মাধ্যমে ঘন্টার জন্য চাপ দেয় না।

আপডেট: প্রোগ্রাম unbuffer, expectপ্যাকেজের অংশ, বাফারিংয়ের সমস্যা সমাধান করবে। এটি stdout এবং stderr সাথে সাথে স্ক্রিনে এবং ফাইলটিতে তাত্ক্ষণিকভাবে লিখতে বাধ্য করবে এবং সংযুক্ত হয়ে পুনঃনির্দেশিত হওয়ার সময় সেগুলি সিঙ্কে রাখবে tee। উদাহরণ:

$ unbuffer program [arguments...] 2>&1 | tee outfile

7
অসক্সের জন্য কেউ 'আনফার' জানেন?
জন

7
যদি আপনি আনবুফার ব্যবহার করতে না পারেন, জিএনইউ কোর্টিলসগুলিতে স্ট্ডবফ নামে একটি সরঞ্জাম রয়েছে যা আউটপুট বাফারিং প্রতিরোধ করতে ব্যবহার করা যেতে পারে$ stdbuf -o 0 program [arguments...] 2>&1 | tee outfile
পিটার

1
আপনি যদি ওএস এক্স ব্যবহার করে থাকেন তবে বেশিরভাগ ক্ষেত্রে আনবফার ব্যবহার করা প্রান্তিকভাবে সহজ, যদিও আপনি যে কমান্ডটি চালাচ্ছেন তাতে সিগন্যাল দিতে চাইলে তা নয়। আমার মন্তব্যটি লিনাক্সে থাকা ব্যবহারকারীদের জন্য আরও লক্ষ্য ছিল, যেখানে সম্ভবত কোর্টিলগুলি ডিফল্টরূপে ইনস্টল করা থাকে। : @Ethan, যদি আপনি stdbuf সিনট্যাক্স সম্পর্কে বিভ্রান্ত করছি এই উত্তরটি দেখুন stackoverflow.com/a/25548995/942781
পিটার

3
দ্রষ্টব্য যে pythonএকটি বিল্ট ইন বিকল্প রয়েছে -uযা আউটপুটটিকে আনফার করে।
fabian789

1
এমএল মডেলগুলিকে প্রশিক্ষণের জন্য নিখুঁত জীবনকালীন যেখানে আমি অতিরিক্ত কোড ছাড়াই লগইন করতে চাইছি তবে চালানোর জন্য যে ঘন্টা / দিন সময় লাগে তাও আপনাকে ধন্যবাদ, ধন্যবাদ!
রোকোকো

126

আমার পক্ষে কাজ করার আরেকটি উপায় হ'ল,

<command> |& tee  <outputFile>

gnu বাশ ম্যানুয়াল হিসাবে প্রদর্শিত

উদাহরণ:

ls |& tee files.txt

যদি '| &' ব্যবহার করা হয়, কমান্ড 1 এর স্ট্যান্ডার্ড ত্রুটি , এর স্ট্যান্ডার্ড আউটপুট ছাড়াও , পাইপের মাধ্যমে কমান্ড 2 এর স্ট্যান্ডার্ড ইনপুটটির সাথে সংযুক্ত থাকে; এটি 2> & 1 | এর জন্য সংক্ষিপ্ত মান আউটপুটে মান ত্রুটির এই অন্তর্নিহিত পুনর্নির্দেশ কমান্ড দ্বারা নির্দিষ্ট কোনও পুনর্নির্দেশের পরে সঞ্চালিত হয় is

আরও তথ্যের জন্য, পুনঃনির্দেশ উল্লেখ করুন


10
আপনি যদি $?পরে ব্যবহার করেন তবে এটির স্থিতি কোডটি ফিরিয়ে দেবে tee, যা সম্ভবত আপনি চান তা নয়। পরিবর্তে, আপনি ব্যবহার করতে পারেন ${PIPESTATUS[0]}
লাগাউট

1
এই পদ্ধতিটি রঙিন কনসোল আউটপুট বাতিল করে, কোনও ধারণা?
shakram02

চেষ্টা করুন: আনবুফার ls -l --color = অটো | টি ফাইলস টেক্সট
লুসিয়ানো অ্যান্ড্রেস মার্টিনি

17

আপনি প্রাথমিকভাবে জোরডাচি সমাধানটি ব্যবহার করতে পারেন , তবে আপনি যদি আউটপুট ফাইলটি ওভাররাইট করতে না চান তবে আপনার অনুসরণ সহ টি -a বিকল্পটি লিখতে হবে:

ls -lR / | tee -a output.file

11

কিছু যোগ করার জন্য ...

ফেডোরা এবং রেডহ্যাট ইউনিক্স রিলিজের অধীনে প্যাকেজ আনবফারের কিছু প্যাকেজগুলির সহায়তা সংক্রান্ত সমস্যা রয়েছে।

ঝামেলা সরিয়ে রেখেছি

নিম্নলিখিত আমার জন্য কাজ করে

bash myscript.sh 2>&1 | tee output.log

আপনাকে ধন্যবাদ ScDF & ম্যাথু আপনার ইনপুট আমাকে সময় অনেক সংরক্ষণ ..



3

বোনাস উত্তর যেহেতু এই ব্যবহারের ক্ষেত্রে আমাকে এখানে এনেছে:

যে ক্ষেত্রে আপনাকে অন্য কোনও ব্যবহারকারী হিসাবে এটি করতে হবে

echo "some output" | sudo -u some_user tee /some/path/some_file

নোট করুন যে প্রতিধ্বনিটি আপনার এবং ফাইল রাইটিংটি "some_user" হিসাবে ঘটবে যা কাজ করবে না যদি আপনি "কিছু_ ব্যবহারকারী" হিসাবে প্রতিধ্বনি চালান এবং >> "some_file" দিয়ে আউটপুট পুনর্নির্দেশ করা হয় কারণ ফাইল পুনঃনির্দেশ ঘটবে তোমার মত.

ইঙ্গিত: টি এছাড়াও -a ফ্ল্যাগের সাথে সংযোজনকে সমর্থন করে, যদি আপনাকে অন্য একটি ব্যবহারকারী হিসাবে কোনও ফাইলের একটি লাইন প্রতিস্থাপন করতে হয় তবে আপনি কাঙ্ক্ষিত ব্যবহারকারী হিসাবে সেডকে কার্যকর করতে পারেন।


2

< command > |& tee filename # এটি একটি কনটেন্ট হিসাবে কমান্ডের স্থিতি সহ একটি ফাইল "ফাইলের নাম" তৈরি করবে, যদি কোনও ফাইল ইতিমধ্যে বিদ্যমান থাকে তবে এটি বিদ্যমান সামগ্রী সরিয়ে ফেলবে এবং কমান্ডের স্থিতি লিখবে।

< command > | tee >> filename # এটি ফাইলের স্থিতি সংযোজন করবে তবে এটি স্ট্যান্ডার্ড_আউটপুট (স্ক্রিন) এ কমান্ডের স্থিতি মুদ্রণ করবে না।

আমি স্ক্রিনে "প্রতিধ্বনি" ব্যবহার করে কিছু মুদ্রণ করতে চাই এবং সেই প্রতিধ্বনিত ডেটা কোনও ফাইলে যুক্ত করতে চাই

echo "hi there, Have to print this on screen and append to a file" 

1

আপনার স্ক্রিপ্টের শুরুতে এমন কিছু ব্যবহার করে আপনি এটি পুরো স্ক্রিপ্টের জন্য করতে পারেন:

#!/usr/bin/env bash

test x$1 = x$'\x00' && shift || { set -o pipefail ; ( exec 2>&1 ; $0 $'\x00' "$@" ) | tee mylogfile ; exit $? ; }

# do whaetever you want

এই পুনর্নির্দেশ উভয় দ্বারা stderr নামক ফাইল stdout- এ আউটপুট mylogfile এবং সবকিছু stdout- এ যায় দিন একই সময়ে

এটি কিছু বোকা কৌশল ব্যবহার করা হয়:

  • execপুনর্নির্দেশগুলি সেটআপ করতে কমান্ড ছাড়াই ব্যবহার করুন ,
  • teeডুপ্লিকেট আউটপুট ব্যবহার করুন ,
  • স্ক্রিপ্টটি পুনঃসূচনাটি চেয়েছিল পুনর্নির্দেশের মাধ্যমে,
  • স্ক্রিপ্টটি পুনরায় চালু হয়েছে তা নির্দিষ্ট করার জন্য একটি বিশেষ প্রথম প্যারামিটার ( বিশেষ বাশ চিহ্নিতকরণ NULদ্বারা নির্দিষ্ট একটি সাধারণ অক্ষর $'string') ব্যবহার করুন (কোনও সমতুল্য প্যারামিটার আপনার মূল কাজ ব্যবহার করতে পারে না),
  • pipefailবিকল্পটি ব্যবহার করে স্ক্রিপ্টটি পুনরায় চালু করার সময় আসল প্রস্থান স্থিতি সংরক্ষণের চেষ্টা করুন ।

কদর্য কিন্তু নির্দিষ্ট পরিস্থিতিতে আমার জন্য দরকারী।


-13

টি এটির জন্য উপযুক্ত, তবে এটি কাজটিও করবে

ls -lr / > output | cat output

10
আউটপুট ইতিমধ্যে বিদ্যমান না থাকলে এটি একটি ত্রুটি এবং এটি যদি আপনি চান তবে তা না করে, সামগ্রিকভাবে এটি অযৌক্তিক। সম্ভবত আপনি বোঝাতে চেয়েছিলেন ";" "|" এর পরিবর্তে ?
রবার্ট গাম্বল

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