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


1533

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

cmd > file.txt

বাশে স্টাডাউটকে পুনর্নির্দেশ করতে , কোনও ফাইলে সংযুক্ত করে, আমি ব্যবহার করতে জানি:

cmd >> file.txt

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

cmd &> file.txt

আমি কীভাবে কোনও ফাইলগুলিতে সংযোজন stdout এবং stderr উভয়ই পুনর্নির্দেশ করব ? cmd &>> file.txtআমার জন্য কাজ করে না।


37
আমি নোট করতে চাই যে &> আউটফাইল একটি বাশ (এবং অন্যদের) নির্দিষ্ট কোড এবং পোর্টেবল নয়। পোর্টেবল যাওয়ার উপায় (
সংযোজনীয়

উত্তর:


1996
cmd >>file.txt 2>&1

বাশ নীচে বাম থেকে ডানদিকে পুনঃনির্দেশগুলি সম্পাদন করে:

  1. >>file.txt: file.txtঅ্যাপেন্ড মোডে খুলুন এবং stdoutসেখানে পুনর্নির্দেশ করুন ।
  2. 2>&1: " বর্তমানে কোথায় চলছে"stderr তে পুনর্নির্দেশ করুন । এই ক্ষেত্রে, এটি অ্যাপেন্ড মোডে খোলা একটি ফাইল। অন্য কথায়, বর্তমানে ব্যবহৃত ফাইল বিবরণকারী পুনরায় ব্যবহার করে usesstdout&1stdout

33
দুর্দান্ত কাজ! তবে এটি অনুধাবন করার কোনও উপায় আছে বা আমার এটি কী পারমাণবিক বাশ নির্মাণের মতো আচরণ করা উচিত?
ফ্লাইবায়ার

181
এটি সাধারণ পুনঃনির্দেশ, পুনঃনির্দেশ বিবৃতিগুলি বরাবর থেকে বাম থেকে ডানে মূল্যায়ন করা হয়। >> ফাইল: লাল। ফাইল (স্ট্যান্ড মোড) এ সংযুক্ত করুন (1 >> ফাইলের জন্য সংক্ষিপ্ত) 2> & 1: লাল। STDERR এ "যেখানে stdout যায়" নোট করুন যে অনুবাদ "STDERR কে STDOUT এ পুনঃনির্দেশ" ভুল হয়েছে is
দ্য বনসাই

31
এটি "file.txt এ আউটপুট (stdout, ফাইল বর্ণনাকারী 1) যুক্ত করুন এবং স্টেডারার (ফাইল বর্ণনাকারী 2) এফডি 1 হিসাবে একই জায়গায় প্রেরণ করুন" বলে।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

2
@ দ্য বনসাই তবে আমার কী প্রয়োজন যদি অন্য কোনও ফাইলে এসটিডিআরআর পুনর্নির্দেশ করা প্রয়োজন তবে সংযোজন? এটা কি সম্ভব?
এড়োড

41
আপনি যদি cmd >>file1 2>>file2এটি করেন তবে এটি যা চান তা অর্জন করা উচিত।
উড্রো ডগলাস

367

আপনার বাশ সংস্করণটির উপর নির্ভর করে এটি করার দুটি উপায় রয়েছে।

ক্লাসিক এবং বহনযোগ্য ( ব্যাশ প্রাক -4 ) উপায়টি হ'ল:

cmd >> outfile 2>&1

একটি ননপোর্টেবল উপায়, বাশ 4 দিয়ে শুরু is

cmd &>> outfile

(এনালগ &> outfile)

ভাল কোডিং শৈলীর জন্য, আপনার উচিত

  • স্থিতাবস্থা একটি উদ্বেগ কিনা তা স্থির করুন (তারপরে ক্লাসিক উপায় ব্যবহার করুন)
  • এমনকি বাশ প্রি -4-তেও বহনযোগ্যতা উদ্বেগজনক কিনা তা স্থির করুন (তারপরে ক্লাসিক পদ্ধতি ব্যবহার করুন)
  • আপনি কোন সিনট্যাক্স ব্যবহার করেন না কেন, এটি একই স্ক্রিপ্টের মধ্যে পরিবর্তন করবেন না (বিভ্রান্তি!)

যদি আপনার স্ক্রিপ্টটি ইতিমধ্যে শুরু হয় #!/bin/sh(উদ্দেশ্যযুক্ত বা না তা নির্বিশেষে), তবে বাশ 4 সমাধান এবং সাধারণভাবে কোনও বাশ-নির্দিষ্ট কোড, যাওয়ার উপায় নয়।

এছাড়াও মনে রাখবেন যে বাশ 4 &>>কেবল সংক্ষিপ্ত আকারের সিন্থ্যাক্স - এটি কোনও নতুন কার্যকারিতা বা এর মতো কিছু প্রবর্তন করে না।

সিনট্যাক্স হল (অন্যান্য ফেরৎ সিনট্যাক্স পাশে) এখানে বর্ণনা http://bash-hackers.org/wiki/doku.php/syntax/redirection#appending_redirected_output_and_error_output


8
আমি & >> এবং এটি &> এবং >> এর সাথে সামঞ্জস্যপূর্ণ হিসাবে পছন্দ করি। 'এই ফাইলটিতে আউটপুট এবং ত্রুটি সংযোজন' পড়া 'আউটপুটটিতে ত্রুটিগুলি প্রেরণ করা, এই ফাইলটিতে আউটপুট সংযোজন করা' পড়া আরও সহজ। নোট করুন যখন লিনাক্সে সাধারণত লেখার সময় বাশ, ওএস এক্স এর বর্তমান সংস্করণ থাকে তবে
হোমব্রিউ

আমি এটিকে আরও পছন্দ করি কারণ এটি লাইন হিসাবে সংক্ষিপ্ত এবং কেবল টোইওয়ের স্থান রয়েছে, তবে উদাহরণস্বরূপ zsh "& >>" এর বাইরে কী করবে?
ফিলিপ

আরও লক্ষণীয় যে, ক্রোন চাকরিতে আপনাকে প্রি -4 সিনট্যাক্সটি ব্যবহার করতে হবে, এমনকি আপনার সিস্টেমে বাশ 4 রয়েছে
হাইপারকনট

5
@ জেসেরো ক্রোন ব্যাশ মোটেও ব্যবহার করে না ... এটি ব্যবহার করে sh। আপনি prepending করে ডিফল্ট শেল পরিবর্তন করতে পারেন SHELL=/bin/bashথেকে crontab -eফাইল।
রায় ফস

89

বাশে আপনি স্পষ্টভাবে বিভিন্ন ফাইলে আপনার পুনর্নির্দেশগুলি নির্দিষ্ট করতে পারেন:

cmd >log.out 2>log_error.out

সংযোজন হবে:

cmd >>log.out 2>>log_error.out

6
আপনার প্রথম বিকল্পটি ব্যবহার করে একই ফাইলে দুটি স্ট্রিম পুনঃনির্দেশ করা প্রথমটিকে দ্বিতীয়টির "শীর্ষে" লেখার কারণ হিসাবে কিছু বা সমস্ত সামগ্রীর ওভাররাইট করে। ব্যবহারের cmd >> log.out 2> log.out পরিবর্তে।
ওরেস্টিস পি।

3
এটি ধরার জন্য ধন্যবাদ; তুমি ঠিক বলেছ, একজন আরেকজনকে আঁতকে উঠবে। তবে আপনার কমান্ডটিও কাজ করে না। আমি মনে করি একই ফাইলটিতে লেখার একমাত্র উপায়টি আগে দেওয়া হয়েছিল cmd >log.out 2>&1। আমি প্রথম উদাহরণটি সরাতে আমার উত্তর সম্পাদনা করছি।
হারুন আর।

65

বাশ 4 এ (পাশাপাশি জেডএসএইচ 4.3.11):

cmd &>>outfile

বাক্সের বাইরে


2
@ সমস্ত: এটি একটি ভাল উত্তর, যেহেতু এটি ব্যাশের সাথে কাজ করে এবং সংক্ষিপ্ত, সুতরাং আমি নিশ্চিত হয়েছি যে এটিতে ব্যাশের উল্লেখ রয়েছে তা স্পষ্টভাবে উল্লেখ করেছি।
মাইকম্যাকানা

10
@ মিকেম্যাকানা: থোনসাইয়ের উত্তরটি ২০০৯ সাল থেকে 4 টি সমাধানকে
বাশার

52

এটি ভাল কাজ করা উচিত:

your_command 2>&1 | tee -a file.txt

এটি file.txt- এ সমস্ত লগ সংরক্ষণের পাশাপাশি টার্মিনালে ডাম্প করবে।


আপনি যদি টার্মিনালেও আউটপুট দেখতে চান তবে এটি সঠিক উত্তর। তবে এটি মূলত প্রশ্ন করা প্রশ্ন ছিল না।
মিক্কো রেন্টালাইনেন

25

এটা চেষ্টা কর

You_command 1>output.log  2>&1

আপনার &> x.file এর ব্যবহার bash4 এ কাজ করে। এর জন্য দুঃখিত: (

এখানে কিছু অতিরিক্ত টিপস আসে।

0, 1, 2 ... 9 বাশ-এ ফাইল বর্ণনাকারী।

0 এর জন্য দাঁড়ায় stdin, 1 টি দাঁড়ায় stdout, 2 টি দাঁড়ায় stderror। অন্য কোনও অস্থায়ী ব্যবহারের জন্য 3 ~ 9 অতিরিক্ত।

অপারেটর >বা >>(সংযোজন) ব্যবহার করে যে কোনও ফাইল বর্ণনাকারী অন্য ফাইল বর্ণনাকারী বা ফাইলগুলিতে পুনঃনির্দেশ করা যায় ।

ব্যবহার: < file_descriptor > > < ফাইলের নাম | & file_descriptor >

দয়া করে http://www.tldp.org/LDP/abs/html/io-redirection.html দেখুন


আপনার উদাহরণটি ওপি যেমন জিজ্ঞাসা করেছে তার চেয়ে আলাদা কিছু করবে: এটি স্টাডারের You_commandস্টাডার এবং You_commandফাইলে স্টাডাউটকে পুনর্নির্দেশ করবে output.log। অতিরিক্তভাবে এটি ফাইলটিতে সংযোজন করবে না তবে এটি ওভাররাইট হবে।
পাবউক

সঠিক: ফাইল বর্ণনাকারী যে কোনও মান হতে পারে যা অন্য সমস্ত ফাইলের জন্য 3 এর বেশি।
Itachi

5
আপনার উত্তরটি সর্বাধিক সাধারণ আউটপুট পুনঃনির্দেশের ত্রুটি দেখায়: STDERR বর্তমানে নির্দেশ করছে যেখানে STDERR পুনর্নির্দেশ এবং কেবল STDOUT কে ফাইলে পুনঃনির্দেশ করার পরে। এটি STDERR একই ফাইলটিতে পুনঃনির্দেশিত করবে না। পুনঃনির্দেশ বিষয়গুলির অর্ডার।
জান উইখলম

1
এর অর্থ কি, আমার প্রথমে STDERROR কে STDOUT এ পুনঃনির্দেশ করা উচিত, তারপরে STDOUT কে একটি ফাইলে পুনর্নির্দেশ করা উচিত। 1 > output.log 2>&1
কুইন্টাস.জ়ৌ

1
@ কুইন্টাস.জৌ ইউ আপনার সংস্করণ ভুল থেকে পুনঃনির্দেশ করে এবং একই সাথে ফাইল করার জন্য।
অ্যালেক্স ইয়ারোশেভিচ

11

আমি অবাক হয়েছি যে প্রায় দশ বছরে, কেউ এখনও এই পদ্ধতির পোস্ট করেনি:

যদি ব্যাশের পুরানো সংস্করণগুলি ব্যবহার করা হয় যেখানে &>>উপলভ্য নয়, আপনি এটি করতে পারেন:

(cmd 2>&1) >> file.txt

এটি একটি সাবশেল তৈরি করেছে, সুতরাং এটি প্রচলিত পদ্ধতির তুলনায় কম দক্ষ cmd >> file.txt 2>&1এবং এটি ফলস্বরূপ যে কমান্ডগুলিকে বর্তমান শেলটি (যেমন cd, pushd) সংশোধন করতে হবে তার পক্ষে কাজ করবে না , তবে এই পদ্ধতিটি আমার কাছে আরও প্রাকৃতিক এবং বোধগম্য মনে হয়:

  1. স্ট্যাডারকে স্টডআউটে পুনর্নির্দেশ করুন।
  2. কোনও ফাইলে সংযুক্ত করে নতুন স্টডআউট পুনর্নির্দেশ করুন।

এছাড়াও, বন্ধনীগুলি অর্ডারটির যে কোনও অস্পষ্টতাকে সরিয়ে দেয়, বিশেষত যদি আপনি পরিবর্তে অন্য কমান্ডের স্টাডাউট এবং স্টডারকে পাইপ করতে চান।


এই প্রয়োগের ফলে সিস্টেম চালনার জন্য আরও একটি অতিরিক্ত প্রক্রিয়া ঘটে। সিনট্যাক্স ব্যবহার cmd >> file 2>&1করা সমস্ত শেলগুলিতে কাজ করে এবং এটি চালানোর জন্য কোনও অতিরিক্ত প্রক্রিয়া প্রয়োজন হয় না।
মিক্কো রেন্টালাইনেন

@ মিকো রেন্টালাইনেন আমি ইতিমধ্যে ব্যাখ্যা করেছি যে এটি একটি সাবশেল তৈরি করেছে এবং কম দক্ষ। এই পদ্ধতির মূল বক্তব্যটি হ'ল দক্ষতা যদি বড় ব্যাপার না হয় (এবং এটি খুব কমই হয়) তবে এই উপায়টি মনে রাখা সহজ এবং ভুল হওয়া শক্ত to
জেমসডলিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.