কেন আউটপুট পুনঃনির্দেশ 2> এবং 1 এবং 1> 2?


30

আমি ব্যবহার করে বিভিন্ন কমান্ড জুড়ে এসেছেন 2>&1 এবং 1>&2, কিন্তু আমি এটি ব্যবহার করার উদ্দেশ্যে এবং যখন এটি ব্যবহার করা উচিত তার উদ্দেশ্য প্রায় আমার মাথা পেতে পারি না।

আমি কি বুঝতে

আমি যে জানি 1 স্ট্যান্ডার্ড প্রতিনিধিত্ব করে এবং 2 স্ট্যান্ডার্ড ত্রুটি প্রতিনিধিত্ব করে। আমি বুঝতে পারি যে 2>&1 আউটপুট একত্রিত করে 2 থেকে 1 এবং বিপরীতভাবে.

আমি কি পেতে না

  1. আমি কখন এটি ব্যবহার করা উচিত?
  2. এটা কি উদ্দেশ্য পরিবেশন করে?

উত্তর:


34

কখনও কখনও আপনি উভয় stdout পুনঃনির্দেশিত করতে চান এবং একই অবস্থানে stderr, এই যখন >& ব্যবহৃত হয় - এটি অন্য একটি ফাইল বর্ণনাকারী নির্দেশ করে।


উদাহরণস্বরূপ, যদি আপনি একই ফাইলটিতে stdout এবং stderr উভয় লিখতে চান (এটি হতে /dev/null অথবা output.txt ), আপনি, আলাদাভাবে তাদের পুনঃনির্দেশিত করতে পারেন

app 1>/dev/null 2>/dev/null

অথবা আপনি ফাইলটিতে একটি ফাইল বর্ণনাকারীকে পুনঃনির্দেশিত করতে পারেন এবং অন্য ফাইলের বর্ণনাকারীকে প্রথমটিতে পুনঃনির্দেশিত করতে পারেন:

app 1>/dev/null 2>&1

app 2>/dev/null 1>&2

প্রথম উদাহরণে, 2>&1 পয়েন্ট ফাইল বর্ণনাকারী # 2 যেখানে # 1 ইতিমধ্যে নির্দেশ করছে। দ্বিতীয় উদাহরণ একই অর্জন, পরিবর্তে stderr পরিবর্তে।

অন্য উদাহরণ হিসাবে, স্টুডাউট (ফাইল বর্ণনাকারী # 1) ইতোমধ্যে পছন্দসই অবস্থানে ইঙ্গিত দিচ্ছে এমন ক্ষেত্রে এমন কিছু ঘটনা রয়েছে, তবে আপনি এটি নাম অনুসারে উল্লেখ করতে পারবেন না (এটি একটি পাইপ, একটি সকেট, বা এর সাথে যুক্ত হতে পারে)। প্রক্রিয়া সম্প্রসারণ (যখন ` ` অথবা $( ) অপারেটর), যা সাধারণত স্টডাউটকে কেবলমাত্র ক্যাপচার করে তবে আপনি এটিতে স্টেডার অন্তর্ভুক্ত করতে চাইতে পারেন। এই ক্ষেত্রে, আপনি ব্যবহার করতে হবে >& stderout stdout নির্দেশ করতে:

out=$(app 2>&1)

আরেকটি সাধারণ উদাহরণ একটি পেজার, বা grep, পাইপ থেকে, বা অনুরূপ উপযোগ | সাধারণত stdout এ শুধুমাত্র কাজ করে, আপনি পাইপ ব্যবহার করার আগে stderr stdout এ পুনঃনির্দেশিত করবেন:

app 2>&1 | grep hello

কিভাবে জানতে হবে 2>&1 অথবা 1>&2 সঠিক? দ্য ইতিমধ্যে সেট আপ ফাইল বর্ণনাকারী অধিকার যায় >&, এবং আপনি ফাইল পুনর্নির্দেশ করতে চান ফাইল descriptor বাম যায়। ( 2>&1 মানে "বিন্দু ফাইল বর্ণনাকারী # 2 ফাইল বর্ণনাকারী ফাইল # 1"।)


কিছু শেলগুলিতে সাধারণ পুনঃনির্দেশনার জন্য শর্টকাট রয়েছে; এখানে বাশ থেকে উদাহরণ:

  • 1> শুধু সংক্ষিপ্ত হতে পারে >

  • 1>foo 2>&1 থেকে >&foo অথবা &>foo

  • 2>&1 | program থেকে |& program


আমি যে কোন ধারণা ছিল app 1>/dev/null 2>&1 এর অর্থ হ'ল 2 & gt; 1 ফাইলটি নির্দেশ করবে যে 1 টি ইতিমধ্যে পুনঃনির্দেশিত হচ্ছে। আমি এটা সহজেই সহজেই করতে পারি app > /dev/null &>?
PeanutsMonkey

আমি বুঝতে একটি কঠিন সময় হচ্ছে the already set up fd goes to the right of >&, and the fd you want to redirect goes to the left। আপনি ইতিমধ্যে সেট আপ ফাইল বর্ণনাকারী দ্বারা কি বোঝাতে চান? এর মানে কী?
PeanutsMonkey


যদি না আপনি আমাকে নির্দেশনা শেখানোর ইচ্ছা না করেন তবে দুঃখিত, আমি আগে উল্লেখিত বিবৃতিটি অনুসরণ করি না।
PeanutsMonkey

1
প্রতিটি ফাইল বর্ণনাকারীকে এক সময়ে এক থেকে পুনঃনির্দেশিত করুন, বাম থেকে ডানে এবং সেই নিয়মগুলিতে সেই নিয়মগুলি প্রয়োগ করুন। আপনি যদি প্রথম একটি ফাইল stdout পুনঃনির্দেশিত, তারপর stderr যেখানে এখন আমাদের pointing stderr পুনঃনির্দেশিত, তারপর stderr এবং stdout একই ফাইল যেতে হবে। আপনি যদি সেগুলি দুইটি পুনঃনির্দেশ পুনরুদ্ধার করেন তবে আপনি বিভিন্ন ফলাফল পাবেন (stderr টি পুনঃনির্দেশিত করুন যেখানে stdout চলছে এখন , তারপর স্টেডাউটটি অন্য কোনও ফাইলের দিকে নির্দেশ করুন, যখন এটি স্থির করা হয় যেখানে স্টারডার চলতে থাকে)।
Jason

2

আপনি যখন এটি প্রদর্শন করতে চান তখন এটির প্রয়োজনে একটি পরিস্থিতি strace একটি পেজার আউটপুট। strace স্ট্যান্ডার্ড তার আউটপুট প্রিন্ট এরর এবং পাইপ সাধারণত মান সংযোগ আউটপুট মান ইনপুট, তাই আপনাকে পুনঃনির্দেশ ব্যবহার করতে হবে:

strace -p $pid 2>&1 | less

আপনি কি বোঝাতে চাচ্ছেন pipes generally connect standard output to standard input?
PeanutsMonkey

2
আমি যে পাইপ মানে | ) প্রথম কমান্ডের স্ট্যান্ডার্ড আউটপুট গ্রহণ করুন এবং দ্বিতীয় কমান্ডের স্ট্যান্ডার্ড ইনপুট এ এটি সংযুক্ত করুন।
jpalecek

2

কখনও কখনও আপনি উভয় পুনঃনির্দেশিত করতে চান stdout ( 1 ) এবং stderr ( 2 ) একই অবস্থানে ( /dev/null, উদাহরণ স্বরূপ). এই অর্জনের এক উপায় হবে:

$ program 1>/dev/null 2>/dev/null

কিন্তু অধিকাংশ মানুষ পুনঃনির্দেশিত দ্বারা এই সংক্ষিপ্ত stderr থেকে stdout সঙ্গে 2>&1:

$ program 1>/dev/null 2>&1

এমনকি একটি ছোট সংস্করণ হল:

$ program >&- 2>&-

1

2: এটির জন্য যখন আপনি আউটপুট উভয় স্ট্যান্ডার্ড ত্রুটি এবং মানক থেকে আসছে, এবং আপনি তাদের একটি স্ট্রিংয়ে রচনা করতে চান।

1: আপনি যখন উভয় স্ট্যান্ডার্ড ত্রুটি এবং মান আউটপুট ম্যানিপুলেট করতে চান।


আপনি ম্যানিপুলেশন মানে কি? আমার বোঝার কিছু পুনঃনির্দেশিত হয় >2 পাঠানো হয় / dev / null। নাকি আমি পুরোপুরি ভুল করেছি?
PeanutsMonkey

যে সঠিক নয়। ম্যানিপুলেশন দ্বারা আমি grep বা এটি অনুরূপ কিছু পাইপ মানে। দেখ এখানে একটি উদাহরণ জন্য।
soandos

0

আমি একটি পৃথক কাজ শুরু করার জন্য এটি ব্যবহার করুন:

someProgram 2>&1 >& my.log &

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


1
প্রোগ্রামটি পাঠানো কোন SIGHUP নেই যতক্ষণ এটি শুধুমাত্র কাজ করে। ভাল ব্যবহার nohup অথবা disown এই ক্ষেত্রে.
slhck

@ স্লেকঃ ঠিক আছে। কিন্তু আমি প্রোগ্রামে SIGHUP পাঠাতে না - কেউ না, অধিকার?
Adobe

না, নিয়ন্ত্রণকারী টার্মিনাল SIGHUP এর সাথে লগআউটের প্রক্রিয়াগুলিকে সতর্ক করবে। অনুশীলনে, আপনি যদি SSH এর মাধ্যমে একটি রিমোট শেল চালান এবং প্রস্থান করেন, উদাহরণস্বরূপ, আপনার প্রক্রিয়াটিও মারা যাবে।
slhck

@ স্লেকঃ সত্য হতে পারে না: আমি কয়েক বছর ধরে এটি ব্যবহার করি - আমি ssh লগ আউট করি, এবং প্রক্রিয়া চলছে।
Adobe

আমি আরো বিস্তারিতভাবে এটি দেখতে হবে, কিন্তু শুধুমাত্র পটভূমি মধ্যে প্রোগ্রাম নির্বাণ সব ক্ষেত্রে আমার জন্য কাজ করেনি, এবং এটা আমার স্থানীয় মেশিনে এমনকি কাজ করে না। জশ এবং বাশ এখানে ভিন্নভাবে আচরণ করে, মনে হচ্ছে।
slhck

0

নাম একটি ডিরেক্টরি আছে কল্পনা করুন try যে এই তিনটি ফাইল আছে: file file1 and file2.

এখন এই কমান্ড চালান:

cat file file1 file2 file3

প্রথম তিনটি ফাইল খোলা কিন্তু cat চতুর্থটি খোলার সময় একটি ত্রুটি ছড়িয়ে দেয় কারণ এটি বিদ্যমান নয়।

এখন রান করুন:

cat file file1 file2 file3 1>outfile 2>&1

আপনি পর্দায় কোন আউটপুট দেখতে হবে না: প্রথমত 1>outfile কমান্ড আউটপুট পুনঃনির্দেশিত করা হবে outfile এবং তারপর এটি পুনঃনির্দেশিত করা হবে ( 2>&1 ) খোলা চেষ্টা করার সময় নিক্ষিপ্ত ত্রুটি file3 থেকে outfile

1>&2 একইভাবে কাজ করে এবং স্ট্যান্ডার্ড আউটপুট ত্রুটি স্ট্রিম পুনঃনির্দেশ।

আশাকরি এটা সাহায্য করবে!


0

বিকল্প দৃশ্যকল্প: টার্মিনাল কমান্ড অন্য টার্মিনালে আউটপুট প্রদর্শন

ব্যবহার tty তাদের সনাক্ত করতে প্রতিটি টার্মিনাল কমান্ড:

$ tty
/dev/pts/0

$ tty
/dev/pts/1

প্রথমটি স্টেডাউটটিকে দ্বিতীয়টিতে পুনঃনির্দেশিত করতে এই TTYs অনুমান করে, প্রথম টার্মিনালে এটি চালান:

exec 1>/dev/pts/1

নোট: এখন প্রতিটি কমান্ড আউটপুট পিসি / 1 দেখানো হবে

ডিফল্ট আচরণ পিডিএস / 0 এর stdout পুনরুদ্ধার করতে:

exec 1>/dev/pts/0

দেখ এই ভিডিও একটি বিক্ষোভের জন্য।


0

Stdout এ stderr পুনরায় নির্দেশ করার ক্ষেত্রে ইতিমধ্যেই এখানে আচ্ছাদিত করা হয়েছে (উদাহরণস্বরূপ এটি ফিল্টার (grep) ত্রুটি বার্তাগুলিতে ব্যবহার করুন)।

অন্যান্য ক্ষেত্রে stderout stdout পুনঃনির্দেশিত করা হয়। একটি সাধারণ ব্যবহারকক্ষ (অন্তত আমার জন্য) স্টেকারে "ইকো" (আমার শেল স্ক্রিপ্টগুলিতে) দিয়ে মুদ্রিত সতর্কতা / ত্রুটির বার্তা প্রেরণ করা (যাতে তারা ব্যবহারকারীর মনোযোগ আরো সহজেই ধরতে পারে)।

উদাহরণ স্বরূপ,

echo "file \"${file\" does not exist..." 1>&2
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.