শেলটিতে, "2> & 1" এর অর্থ কী?


2281

ইউনিক্স শেল, যদি আমি একত্রিত করতে চান stderrএবং stdoutমধ্যে stdoutআরও ম্যানিপুলেশন জন্য প্রবাহ, আমি আমার কমান্ডের প্রান্তে নিম্নলিখিত সংযুক্ত করতে পারবেন:

2>&1

সুতরাং, আমি যদি headআউটপুটটি ব্যবহার করতে চাই তবে আমি g++এরকম কিছু করতে পারি:

g++ lots_of_errors 2>&1 | head

সুতরাং আমি প্রথম কয়েকটি ত্রুটি দেখতে পাচ্ছি।

আমার এটি মনে রাখতে সবসময়ই সমস্যা হয় এবং আমি ক্রমাগত এটি সন্ধান করতে হয় এবং এটি মূলত কারণ আমি এই বিশেষ কৌশলটির বাক্য গঠনটি পুরোপুরি বুঝতে পারি না।

কেউ এটিকে ভেঙে চরিত্র অনুসারে চরিত্রটি ব্যাখ্যা করতে পারে 2>&1 যার অর্থ?


50
@ ডিবিআর আমি মনে করি না যে এটি কেবল বাশ - আমি বিশ্বাস করি এটি একটি বোঝা শেল জিনিস; অতএব sh, বাশ, ksh, ছাই, ড্যাশ, ইত্যাদি
বন্দুক

8
এটি POSIX- অনুবর্তী শেল, বা সংক্ষেপে POSIX শেল বর্ণনা করে এমন পুনঃনির্দেশ অনুচ্ছেদের অংশ। উদাহরণস্বরূপ ksh একটি POSIX শেল। দেখুন: pubs.opengroup.org/onlinepubs/009695399/utilities/…
জিম এমকনামারা

12
এই কনস্ট্রাক্ট উইন্ডোজেও কাজ করে।
ভাদজিম

2
এটি সাধারণত 2> / dev / null ;-)2>&1
এফ। হুরি

11
আমি উল্লেখ করতে চাই যে |& জন্য সাধারণভাবে সংক্ষেপে হয় 2>&1 |আপনি zsh ব্যবহার করছেন পারেন। এটি অন্যান্য বোর্ন-জাতীয় শেলগুলির ক্ষেত্রে প্রযোজ্য কিনা বা এটি কেবল zsh বৈশিষ্ট্যযুক্ত কিনা তা নিয়ে আমি কথা বলতে পারি না।
ক্রিক্সিয়ান

উত্তর:


2553

ফাইল বর্ণনাকারী 1 হ'ল মান আউটপুট ( stdout)।
ফাইল বর্ণনাকারী 2 হ'ল মান ত্রুটি stderr)

এই নির্মাণটি মনে রাখার জন্য এখানে একটি উপায় রয়েছে (যদিও এটি সম্পূর্ণ সঠিক নয়): প্রথমে, 2>1পুনর্নির্দেশের stderrজন্য ভাল পদ্ধতির মতো দেখতে পারেন stdout। যাইহোক, এটি আসলে " stderrনামের ফাইলটিতে পুনর্নির্দেশ" হিসাবে ব্যাখ্যা করা হবে 1&ইঙ্গিত দেয় যে এর পরে যা ঘটে তা ফাইল ফাইল নয়, একটি ফাইল বর্ণনাকারী। সুতরাং কনস্ট্রাক্ট হয়ে: 2>&1


280
তবে কি তা বরং হওয়া উচিত নয় &2>&1?
dokaspar

319
@ ডোমিনিক: না, &কেবল পুনর্নির্দেশের প্রসঙ্গে "ফাইল বর্ণনাকারী" অর্থ বোঝানো হয়। রচনাটি command &2>&পার্স করা হয় command &এবং হিসাবে 2>&1, " commandব্যাকগ্রাউন্ডে রান করুন, তারপরে কমান্ডটি চালান 2এবং তার স্টডআউটটিকে তার স্টাডাউটে পুনর্নির্দেশ করুন"।
অ্যাডাম রোজেনফিল্ড

15
তারা কেন এরকম আরকেন স্টাফ বেছে নিল? উৎসুক.
কমাটোস্ট

81
তবে আপনি কীভাবে স্ট্যান্ডারকে '& 1' নামের একটি ফাইলে পুনর্নির্দেশ করবেন?
মার্টন ফিক্সম্যান

120
@ মার্টিন:2>'&1'

631
echo test > afile.txt

stdout এ পুনঃনির্দেশ afile.txt। এটি করা একই

echo test 1> afile.txt

Stderr পুনর্নির্দেশ করতে, আপনি কি:

echo test 2> afile.txt

>& একটি স্ট্রিমকে অন্য ফাইল বর্ণনাকারীর দিকে পুনঃনির্দেশ করার সিনট্যাক্স - 0 টি স্টিডিন, 1 টি স্টাডাউট এবং 2 টি স্টডারার।

আপনি স্টাডাউটকে স্টার্ডারে পুনর্নির্দেশ করতে পারেন:

echo test 1>&2 # or echo test >&2

বা তদ্বিপরীত:

echo test 2>&1

সুতরাং, সংক্ষেপে ... 2>স্ট্যাডারকে একটি (অনির্ধারিত) ফাইলে &1পুনর্নির্দেশ করে স্ট্যান্ডারকে স্টাডাউটে পুনঃনির্দেশিত করে।


5
এটি কি আপনার কোনও ধারণা রাখে java ... 2&1 >> data.log, আমি আমার সহকর্মী একজন এটি করে দেখেছি?
থ্যাং ফাম

5
@ হ্যারি যা দেখলে শ্যালে বাশ হয় না, বা টাইপোও হয় না .. cmd 2>&1 >> somefile.logstdout / stderr কে একটি ফাইলে সংযুক্ত করবে - এটি মূলত উপরের মতই >> fileসংযোজন সহ
dbr

73
@ ডিবিআর স্ট্যাডারকে cmd 2>&1 >>fileফাইলে পুনর্নির্দেশ করে না তবে cmd >> file 2>&1তা করে। অর্ডার বিষয়গুলি। প্রথম ক্ষেত্রে, স্টার্ডারটি শেলের স্টাডাউটে পুনর্নির্দেশ করা হয় (কমান্ডটি ইন্টারেক্টিভভাবে প্রবেশ করাতে সম্ভবত একটি টিটি), এবং তারপরে stdout ফাইলটিতে পরিচালিত হয়। দ্বিতীয় ক্ষেত্রে, স্টডআউট ফাইলের দিকে পরিচালিত হয়, এবং তারপরে স্ট্ডার একই স্থানে পরিচালিত হয়।
উইলিয়াম পার্সেল

2
আমি উপরের উত্তরটি পছন্দ করি তবে এটি স্পর্শকাতর হতে পারে। "2> & 1" স্ট্ডারকে স্টাডাউটের লক্ষ্যে পুনঃনির্দেশ করে। সুতরাং আপনার কাছে যদি "ls -l >> ডিরেক্টরি কনটেন্টস 2> & 1" এর মতো কিছু থাকে তবে ফলাফলটি ডিরেক্টরী নামের একটি ফাইল হবে কনটেন্টসটিতে এতে কাজ করা ডিরেক্টরিটির বিষয়বস্তু থাকবে। যদি মৃত্যুদন্ড কার্যকর করতে কোনও ত্রুটি থাকে: ত্রুটি বার্তাগুলি ডিরেক্টরি কন্টেন্টস ফাইলের সাথে সংযুক্ত হবে, কারণ এটি ঘটে।
ম্যাক্স ওয়েস্ট

1
কি 0(or 1,2)>&0(or 1,2)আউটপুট নিয়ন্ত্রণ করার জন্য একটি বিকল্প মত? কি echo test >test.log 2>&1হিসাবে একই echo test 2>&1 >test.log?
সিমিন জি

318

পুনঃনির্দেশ সম্পর্কে কিছু কৌশল

এটি সম্পর্কে কিছু বাক্য গঠন বিশিষ্টতার গুরুত্বপূর্ণ আচরণ থাকতে পারে। সেখানে প্রায় পুনঃনির্দেশগুলি, কিছু সামান্য নমুনা হয় STDERR, STDOUTএবং আর্গুমেন্ট ক্রম

1 - ওভাররাইটিং বা সংযোজন?

প্রতীক >মানে পুনঃনির্দেশ

  • >মানে একটি সম্পূর্ণ সম্পূর্ণ ফাইল হিসাবে প্রেরণ করুন , যদি উপস্থিত থাকে তবে লক্ষ্যগুলি ওভাররাইটিং ( পরে # 3noclobber এ ব্যাশ বৈশিষ্ট্যটি দেখুন )।
  • >>মানে প্রেরণ ছাড়াও উপস্থিত থাকলে লক্ষ্যতে সংযোজন করা হবে।

যে কোনও ক্ষেত্রে, ফাইলগুলি উপস্থিত না থাকলে সেগুলি তৈরি করা হত।

2 - শেল কমান্ড লাইনটি আদেশ নির্ভর!

এটি পরীক্ষার জন্য, আমাদের একটি সাধারণ কমান্ডের দরকার যা উভয় আউটপুটে কিছু প্রেরণ করবে :

$ ls -ld /tmp /tnt
ls: cannot access /tnt: No such file or directory
drwxrwxrwt 118 root root 196608 Jan  7 11:49 /tmp

$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt 2>/dev/null
drwxrwxrwt 118 root root 196608 Jan  7 11:49 /tmp

(আশা করে আপনার নামের কোনও ডিরেক্টরি নেই /tnt, অবশ্যই;)। ভাল, আমাদের এটা আছে !!

সুতরাং, আসুন দেখুন:

$ ls -ld /tmp /tnt >/dev/null
ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt >/dev/null 2>&1

$ ls -ld /tmp /tnt 2>&1 >/dev/null
ls: cannot access /tnt: No such file or directory

শেষ কমান্ড লাইনটি STDERRকনসোলে যায় এবং এটি প্রত্যাশিত আচরণ বলে মনে হয় না ... তবে ...

আপনি যদি একটি আউটপুট, অন্য বা উভয় সম্পর্কে কিছু পোস্ট ফিল্টার করতে চান :

$ ls -ld /tmp /tnt | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory
<-- drwxrwxrwt 118 root root 196608 Jan  7 12:02 /tmp --->

$ ls -ld /tmp /tnt 2>&1 | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->
<-- drwxrwxrwt 118 root root 196608 Jan  7 12:02 /tmp --->

$ ls -ld /tmp /tnt >/dev/null | sed 's/^.*$/<-- & --->/'
ls: cannot access /tnt: No such file or directory

$ ls -ld /tmp /tnt >/dev/null 2>&1 | sed 's/^.*$/<-- & --->/'

$ ls -ld /tmp /tnt 2>&1 >/dev/null | sed 's/^.*$/<-- & --->/'
<-- ls: cannot access /tnt: No such file or directory --->

লক্ষ্য করুন যে এই অনুচ্ছেদে শেষ কমান্ড লাইনটি পূর্ববর্তী অনুচ্ছেদের মতোই একই, যেখানে আমি লিখেছি প্রত্যাশিত আচরণ বলে মনে হচ্ছে না (সুতরাং এটি এমনকি একটি প্রত্যাশিত আচরণও হতে পারে)।

ঠিক আছে, উভয় আউটপুটগুলিতে আলাদা অপারেশন করার জন্য পুনঃনির্দেশগুলি সম্পর্কে কিছু কৌশল রয়েছে :

$ ( ls -ld /tmp /tnt | sed 's/^/O: /' >&9 ) 9>&2  2>&1  | sed 's/^/E: /'
O: drwxrwxrwt 118 root root 196608 Jan  7 12:13 /tmp
E: ls: cannot access /tnt: No such file or directory

নোটা: &9বর্ণনাকারীর কারণে স্বতঃস্ফূর্তভাবে ঘটবে ) 9>&2

সংযোজন: নোটা! এর নতুন সংস্করণ সহ( >4.0) এই জাতীয় জিনিসগুলি করার জন্য একটি নতুন বৈশিষ্ট্য এবং আরও সেক্সি সিনট্যাক্স রয়েছে:

$ ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /')
O: drwxrwxrwt 17 root root 28672 Nov  5 23:00 /tmp
E: ls: cannot access /tnt: No such file or directory

এবং অবশেষে এই জাতীয় ক্যাসকেডিং আউটপুট বিন্যাসের জন্য:

$ ((ls -ld /tmp /tnt |sed 's/^/O: /' >&9 ) 2>&1 |sed 's/^/E: /') 9>&1| cat -n
     1  O: drwxrwxrwt 118 root root 196608 Jan  7 12:29 /tmp
     2  E: ls: cannot access /tnt: No such file or directory

সংযোজন: নোটা! উভয় উপায়ে একই নতুন বাক্য গঠন:

$ cat -n <(ls -ld /tmp /tnt 2> >(sed 's/^/E: /') > >(sed 's/^/O: /'))
     1  O: drwxrwxrwt 17 root root 28672 Nov  5 23:00 /tmp
     2  E: ls: cannot access /tnt: No such file or directory

যেখানে STDOUTএকটি নির্দিষ্ট ফিল্টার দিয়ে যান, STDERRঅন্যটিতে এবং অবশেষে উভয় আউটপুটগুলি মার্জ হয়ে যায় তৃতীয় কমান্ড ফিল্টারটি।

3 - noclobberবিকল্প এবং >|বাক্য গঠন সম্পর্কে একটি শব্দ

ওভাররাইটিং সম্পর্কে এটি :

কোনও বিদ্যমান ফাইল ওভাররাইট নাset -o noclobber করার জন্য বাশকে নির্দেশ দেওয়ার সময় সিনট্যাক্স আপনাকে এই সীমাবদ্ধতাটি অতিক্রম করতে দেয়:>|

$ testfile=$(mktemp /tmp/testNoClobberDate-XXXXXX)

$ date > $testfile ; cat $testfile
Mon Jan  7 13:18:15 CET 2013

$ date > $testfile ; cat $testfile
Mon Jan  7 13:18:19 CET 2013

$ date > $testfile ; cat $testfile
Mon Jan  7 13:18:21 CET 2013

ফাইলটি প্রতিবার ওভাররাইট করা হয়েছে, এখন ভাল:

$ set -o noclobber

$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan  7 13:18:21 CET 2013

$ date > $testfile ; cat $testfile
bash: /tmp/testNoClobberDate-WW1xi9: cannot overwrite existing file
Mon Jan  7 13:18:21 CET 2013

এর মাধ্যমে পাস করুন >|:

$ date >| $testfile ; cat $testfile
Mon Jan  7 13:18:58 CET 2013

$ date >| $testfile ; cat $testfile
Mon Jan  7 13:19:01 CET 2013

এই বিকল্পটি আনসেট করা এবং / অথবা ইতিমধ্যে সেট করা থাকলে অনুসন্ধান করা।

$ set -o | grep noclobber
noclobber           on

$ set +o noclobber

$ set -o | grep noclobber
noclobber           off

$ date > $testfile ; cat $testfile
Mon Jan  7 13:24:27 CET 2013

$ rm $testfile

4 - শেষ কৌশল এবং আরও ...

প্রদত্ত কমান্ড থেকে উভয় আউটপুট পুনঃনির্দেশের জন্য , আমরা দেখতে পাচ্ছি যে একটি সঠিক বাক্য গঠন হতে পারে:

$ ls -ld /tmp /tnt >/dev/null 2>&1

এই বিশেষ ক্ষেত্রে, একটি শর্টকাট বাক্য গঠন আছে: &>... বা>&

$ ls -ld /tmp /tnt &>/dev/null

$ ls -ld /tmp /tnt >&/dev/null

নোটা: যদি 2>&1উপস্থিত থাকে তবে 1>&2এটিও একটি সঠিক বাক্য গঠন:

$ ls -ld /tmp /tnt 2>/dev/null 1>&2

4 বি- এখন, আমি আপনাকে এই সম্পর্কে ভাবতে দেব:

$ ls -ld /tmp /tnt 2>&1 1>&2  | sed -e s/^/++/
++/bin/ls: cannot access /tnt: No such file or directory
++drwxrwxrwt 193 root root 196608 Feb  9 11:08 /tmp/

$ ls -ld /tmp /tnt 1>&2 2>&1  | sed -e s/^/++/
/bin/ls: cannot access /tnt: No such file or directory
drwxrwxrwt 193 root root 196608 Feb  9 11:08 /tmp/

4 সি- আপনি যদি আরও তথ্যে আগ্রহী হন

আপনি আঘাত করে সূক্ষ্ম ম্যানুয়ালটি পড়তে পারেন:

man -Len -Pless\ +/^REDIRECTION bash

এ এ কনসোল ;-)


5
আরও পড়ুন: আপনি যদি এটি পছন্দ করেন তবে আপনি প্রশংসা করতে পারেন: পুনর্নির্দেশ অপব্যবহারটি কীভাবে অদ্ভুত আচরণ দিতে পারে
এফ হৌরি


130

পুনঃনির্দেশে আমি এই উজ্জ্বল পোস্টটি পেয়েছি: সমস্ত পুনঃনির্দেশ সম্পর্কে

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

$ কমান্ড ও> ফাইল

এই ওয়ান-লাইনার &>অপারেটরটি আউটপুট স্ট্রিমগুলি - স্টডআউট এবং স্ট্ডার - কমান্ড থেকে ফাইলগুলিতে পুনঃনির্দেশ করতে ব্যবহার করে । উভয় স্ট্রিমকে দ্রুত একই গন্তব্যে পুনর্নির্দেশের জন্য এটি বাশের শর্টকাট।

উভয় স্ট্রিম পুনঃনির্দেশিত করার পরে ফাইল বিবরণকারী টেবিলটি দেখতে কেমন তা এখানে রয়েছে:

এখানে চিত্র বিবরণ লিখুন

আপনি দেখতে পাচ্ছেন, স্ট্যাডআউট এবং স্টডার উভয়ই এখন নির্দেশ করে file। সুতরাং stdout এবং stderr লিখিত কিছু লিখিত হয় file

উভয় স্ট্রিমকে একই গন্তব্যে পুনঃনির্দেশ করার বেশ কয়েকটি উপায় রয়েছে। আপনি প্রতিটি স্ট্রিমকে একের পর এক পুনঃনির্দেশ করতে পারেন:

$ কমান্ড> ফাইল 2> & 1

উভয় স্ট্রিমগুলিকে একটি ফাইলে পুনর্নির্দেশ করার এটি অনেক বেশি সাধারণ উপায়। প্রথমে স্টডআউট ফাইলের জন্য পুনঃনির্দেশিত হয়, এবং তারপরে স্ট্ডার স্টাডআউটের অনুরূপ হিসাবে সদৃশ হয়। সুতরাং উভয় স্ট্রিম শেষ পর্যন্ত ইশারা করে file

যখন বাশ বেশ কয়েকটি পুনঃনির্দেশগুলি দেখে এটি তাদের বাম থেকে ডানে প্রসেস করে। আসুন পদক্ষেপগুলি অতিক্রম করে দেখুন কীভাবে এটি ঘটে। কোনও কমান্ড চালানোর আগে বাশের ফাইল বর্ণনাকারী সারণীটি দেখতে এমন দেখাচ্ছে:

এখানে চিত্র বিবরণ লিখুন

এখন বাশ প্রথম পুনর্নির্দেশ> ফাইলটি প্রক্রিয়া করে। আমরা এটি আগেও দেখেছি এবং এটি ফাইলকে স্টডআউট পয়েন্ট দেয়:

এখানে চিত্র বিবরণ লিখুন

পরবর্তী বাশ দ্বিতীয় পুনঃনির্দেশ 2> & 1 দেখছে। আমরা এই পুনঃনির্দেশটি আগে দেখিনি। ফাইল বর্ণনাকারী 1 এর অনুলিপি হওয়ার জন্য এটি ফাইলের বর্ণনাকারী 2টিকে সদৃশ করে এবং আমরা পাই:

এখানে চিত্র বিবরণ লিখুন

উভয় স্ট্রিম ফাইল করার জন্য পুনঃনির্দেশ করা হয়েছে।

তবে এখানে সাবধান! লেখা

কমান্ড> ফাইল 2> & 1

লেখার মতো নয়:

$ কমান্ড 2> & 1> ফাইল

আদেশে পুনর্নির্দেশের আদেশ বাশে! এই কমান্ডটি কেবলমাত্র স্ট্যান্ডার্ড আউটপুটটিকে ফাইলে পুনঃনির্দেশ করে। Stderr এখনও টার্মিনালে মুদ্রণ করবে। কেন এটি ঘটে তা বুঝতে, আসুন আমরা আবার পদক্ষেপগুলি দিয়ে দেখি। কমান্ডটি চালানোর আগে ফাইল বর্ণনাকারী টেবিলটি এরকম দেখাচ্ছে:

এখানে চিত্র বিবরণ লিখুন

এখন বাশ ডান দিক থেকে পুনরনির্দেশগুলি প্রক্রিয়া করে। এটি প্রথমে 2> ও 1 টি দেখে তাই এটি স্টাডারের স্টাডআউটে নকল করে। ফাইল বর্ণনাকারী টেবিলটি হয়ে যায়:

এখানে চিত্র বিবরণ লিখুন

এখন বাশ দ্বিতীয় পুনর্নির্দেশ দেখতে পাবে >fileএবং এটি স্টডআউটকে ফাইলে পুনঃনির্দেশ করে:

এখানে চিত্র বিবরণ লিখুন

এখানে কি হয় দেখেন? স্টডআউট এখন ফাইলের দিকে ইঙ্গিত করে, তবে স্ট্ডার এখনও টার্মিনালের দিকে নির্দেশ করে! স্ট্যাডারকে লেখা সমস্ত কিছু এখনও পর্দায় মুদ্রিত হয়ে যায়! সুতরাং খুব, খুব পুনর্নির্দেশ ক্রমের সাথে সতর্ক হন!

বাশ-এও লিখুন

$ কমান্ড ও> ফাইল

ঠিক যেমন:

$ কমান্ড> ও ফাইল


3
"কমান্ড" যদি একটি সংখ্যায় শেষ হয় তবে শেষ দুটি আলাদা, তারপরে এটিকে >&
এমএম

খুব সুন্দর অঙ্কন এবং ব্যাখ্যা! "ডুপ্লিকেট" এর সত্যিকারের অর্থ কী আপনি ব্যাখ্যা করতে পারেন? আপনি উল্লেখ করেছেন, "ফাইল বর্ণনাকারী 1 এর অনুলিপি হওয়ার জন্য এই" [2> & 1] নকল ফাইল বর্ণনাকারী 2 "। মনে হচ্ছে স্ট্যাডার স্টাডআউটে নকল হয়ে গেছে। তবে যদি এটি হয় তবে আমারও কি ভুল হওয়া উচিত /dev/tty0?
এইচসিএসএফ

87

নম্বরগুলি ফাইল বর্ণনাকারীদের (এফডি) উল্লেখ করে।

  • শূন্য হয় stdin
  • এক stdout
  • দুটো হল stderr

2>&1 এফডি 2 থেকে 1 টি পুনঃনির্দেশ করে।

প্রোগ্রামটি যদি তাদের ব্যবহার করে তবে এটি কোনও সংখ্যক ফাইল বর্ণনাকারীর জন্য কাজ করে।

আপনি /usr/include/unistd.hযদি তাদের ভুলে যান তবে আপনি দেখতে পারেন:

/* Standard file descriptors.  */
#define STDIN_FILENO    0   /* Standard input.  */
#define STDOUT_FILENO   1   /* Standard output.  */
#define STDERR_FILENO   2   /* Standard error output.  */

এটি বলেছে যে আমি সি সরঞ্জামগুলি লিখেছি যা কাস্টম লগিংয়ের জন্য অ-মানক ফাইল বর্ণনাকারী ব্যবহার করে যাতে আপনি এটি কোনও ফাইল বা কোনও কিছুর কাছে পুনর্নির্দেশ না করে আপনি দেখতে পাবেন না।


58

এই কনস্ট্রাক্টটি স্ট্যান্ডার্ড ত্রুটি প্রবাহটি ( stderr) স্ট্যান্ডার্ড আউটপুট ( ) এর বর্তমান অবস্থানে প্রেরণ করে stdout- এই মুদ্রার ইস্যুটি অন্যান্য উত্তর দ্বারা উপেক্ষিত বলে মনে হয়।

আপনি এই পদ্ধতিটি ব্যবহার করে যে কোনও আউটপুট হ্যান্ডেলটিকে অন্যটিতে পুনর্নির্দেশ করতে পারেন তবে এটি বেশিরভাগ ক্ষেত্রে চ্যানেল stdoutএবং stderrপ্রসেসিংয়ের জন্য একক স্ট্রিমের স্ট্রিমে ব্যবহৃত হয় ।

কিছু উদাহরণ হ'ল:

# Look for ERROR string in both stdout and stderr.
foo 2>&1 | grep ERROR

# Run the less pager without stderr screwing up the output.
foo 2>&1 | less

# Send stdout/err to file (with append) and terminal.
foo 2>&1 |tee /dev/tty >>outfile

# Send stderr to normal location and stdout to file.
foo >outfile1 2>&1 >outfile2

লক্ষ্য করুন যে গত এক হবে না সরাসরি stderrকরতে outfile2- এটা কি তা পুননির্দেশনা stdoutছিল যখন যুক্তি সম্মুখীন হয়েছিল ( outfile1) এবং তারপর পুননির্দেশনা stdoutকরতে outfile2

এটি কিছু চমত্কার কৌতূহল দেয়।


5
যদিও এর শেষ উদাহরণটি আরও স্পষ্ট হবে: foo> আউটফিল 2 2> আউটফিল 1
মাইকেল ক্রেমার

3
পরিষ্কার, হ্যাঁ, তবে এটি "অবস্থানিক" পুনঃনির্দেশের প্রকৃতিটি প্রদর্শন করবে না। উদাহরণটি বোঝা যায় যেহেতু এটি কোনও একক লাইনে সাধারণত কার্যকর হয় না - পদ্ধতিটি সত্যই কার্যকর হয়ে যায় যখন বিভিন্ন পক্ষ পুনঃনির্দেশের বিভিন্ন অংশের জন্য দায়বদ্ধ থাকে। উদাহরণস্বরূপ, যখন কোনও স্ক্রিপ্ট পুনর্নির্দেশের এক বিট করে এবং আপনি এটি অন্য বিট দিয়ে চালান।
প্যাক্সিডিয়াবলো

5
আমি শুধু বুঝতে পারেন যে শেষ উদাহরণ এছাড়াও আমি সংক্রান্ত ছিল কেন এই একটি দীর্ঘ স্থায়ী বিভ্রান্তির সমাধান করা: some_program 2>&1 > /dev/nullভালো কাজ করে না: some_program > /dev/null 2>&1
স্ন্যাপফ্র্যাকাল্পপ্প

সর্বশেষ উদাহরণ সম্পর্কে আপনার মন্তব্যটি স্বর্ণের অক্ষরের জন্য মূল্যবান :-) আমি কখনই ভাবিনি যে এই পুনঃনির্দেশক যুক্তিগুলি স্থিতিকাল ... আমি মনে করি এটি জেনে রাখা বেশ গুরুত্বপূর্ণ।
নিলস-ও-মাদুর

20

2>&1একটি পসিক্স শেল কনস্ট্রাক্ট। এখানে একটি ব্রেকডাউন, টোকেন দ্বারা টোকেন:


2: " স্ট্যান্ডার্ড ত্রুটি " আউটপুট ফাইলের বর্ণনাকারক।

>&: একটি আউটপুট ফাইল বিবরণকারী অপারেটর ( আউটপুট পুনর্নির্দেশ অপারেটরের একটি বৈকল্পিক >) সদৃশ করুন । দেওয়া [x]>&[y], ফাইল বর্ণনাকারী দ্বারা চিহ্নিত xআউটপুট ফাইল বর্ণনাকারীর অনুলিপি করা হয় y

1" স্ট্যান্ডার্ড আউটপুট " আউটপুট ফাইল বিবরণকারী or

অভিব্যক্তি 2>&1কপি ফাইল বর্ণনাকারী 1অবস্থান 2, তাই লেখা কোনো আউটপুট 2সঞ্চালনের পরিবেশে ( "মান ত্রুটি") মূলত দ্বারা বর্ণিত একই ফাইল চলে যায় 1( "মান আউটপুট")।


অারোও ব্যাখ্যা:

ফাইল বর্ণনাকারী : "ফাইল অ্যাক্সেসের উদ্দেশ্যে একটি ওপেন ফাইল সনাক্ত করতে ব্যবহৃত প্রতিটি প্রক্রিয়া অনন্য, অ-নেতিবাচক পূর্ণসংখ্যার"।

স্ট্যান্ডার্ড আউটপুট / ত্রুটি : শেল ডকুমেন্টেশনের পুনঃনির্দেশ বিভাগে নিম্নলিখিত নোটটি দেখুন :

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


19

2 কনসোল মান ত্রুটি।

1 হ'ল কনসোল স্ট্যান্ডার্ড আউটপুট।

এটি স্ট্যান্ডার্ড ইউনিক্স এবং উইন্ডোজও পসিক্স অনুসরণ করে।

যেমন আপনি যখন চালান

perl test.pl 2>&1

স্ট্যান্ডার্ড ত্রুটিটি স্ট্যান্ডার্ড আউটপুটে পুনঃনির্দেশিত হয়, যাতে আপনি উভয় আউটপুট একসাথে দেখতে পারেন:

perl test.pl > debug.log 2>&1

কার্যকর করার পরে, আপনি ত্রুটি সহ সমস্ত আউটপুট, ডিবাগ.লগটিতে দেখতে পাবেন।

perl test.pl 1>out.log 2>err.log

তারপরে স্ট্যান্ডার্ড আউটপুট আউট.লগ এ যায়, এবং স্ট্যান্ডার্ড ত্রুটি এরআরলগে।

আমি আপনাকে এগুলি বোঝার চেষ্টা করার পরামর্শ দিচ্ছি।


দ্বিতীয় নমুনা ভুল: যেমন অর্ডার প্রাধান্য stderr থেকে আপনাকে পুনঃনির্দেশিত করা হয় stdout- এ , শুধুমাত্র ডিফল্ট stdout- এ লেখা হবে debug.log (না stderr ) দেখতে আমার উত্তর (অনুচ্ছেদ # 2)! উভয়কেই একই ফাইলে ডাইরেক্ট করতে হবে তা নিশ্চিত করতে আপনাকে পুনর্নির্দেশের দিকনির্দেশগুলি perl test.pl > debug.log 2>&1
উল্টাতে হবে

16

আপনার প্রশ্নের উত্তর দেওয়ার জন্য: এটি কোনও ত্রুটি আউটপুট নেয় (সাধারণত স্ট্ডারকে প্রেরণ করা হয়) এবং এটি স্ট্যান্ডার্ড আউটপুট (stdout) এ লিখে দেয়।

এটি সহায়ক, উদাহরণস্বরূপ 'আরও' যখন আপনার সমস্ত আউটপুট জন্য পেজিং প্রয়োজন। Stderr মধ্যে মুদ্রণ ব্যবহারের তথ্য মত কিছু প্রোগ্রাম।

আপনাকে মনে রাখতে সাহায্য করার জন্য

  • 1 = স্ট্যান্ডার্ড আউটপুট (যেখানে প্রোগ্রামগুলি সাধারণ আউটপুট প্রিন্ট করে)
  • 2 = স্ট্যান্ডার্ড ত্রুটি (যেখানে প্রোগ্রামগুলি ত্রুটি মুদ্রণ করে)

"2> & 1" স্ট্যাড্রারে প্রেরিত সমস্ত কিছুই কেবল পরিবর্তে স্টাডআউটকে নির্দেশ করে।

আমি এই পোস্টটি পড়ার ত্রুটি পুনর্নির্দেশের ক্ষেত্রেও পড়ার পরামর্শ দিচ্ছি যেখানে এই বিষয়টি পুরো বিশদে আবৃত রয়েছে।


11

প্রোগ্রামারের দৃষ্টিকোণ থেকে এর অর্থ হ'ল:

dup2(1, 2);

দেখুন man পৃষ্ঠা

2>&1এটি একটি অনুলিপি বুঝতে পারার কারণও ব্যাখ্যা করে ...

command >file 2>&1

... এর মতো নয় ...

command 2>&1 >file

প্রথমটি উভয় প্রবাহকে প্রেরণ করবে file, অন্যদিকে ত্রুটিগুলি পাঠাবে stdoutএবং সাধারণ আউটপুটকে file


8

যদি জিজ্ঞেস করা হয় একটি শিক্ষানবিস পড়া আমি এই খুব সহায়ক বলে চিহ্নিত করেছেন এই

আপডেট:
লিনাক্স বা ইউনিক্স সিস্টেমে দুটি স্থানে প্রোগ্রাম আউটপুট প্রেরণ করে: স্ট্যান্ডার্ড আউটপুট (স্টাডআউট) এবং স্ট্যান্ডার্ড ত্রুটি (স্টডার) You আপনি এই আউটপুটটিকে কোনও ফাইলে পুনর্নির্দেশ করতে পারেন।

আপনি যদি এটি করেন তবে

ls -a > output.txt

কিছুই কনসোলে মুদ্রিত হবে না সমস্ত আউটপুট (স্টাডআউট) আউটপুট ফাইলে পুনর্নির্দেশ করা হবে।

এবং আপনি যদি এমন কোনও ফাইলের সামগ্রী মুদ্রণের চেষ্টা করেন যা প্রস্থান করে না মানে আউটপুট একটি ত্রুটি হবে যেমন আপনি টেস্ট.txt প্রিন্ট করেন যা বর্তমান ডিরেক্টরিতে উপস্থিত নেই

cat test.txt > error.txt

আউটপুট হবে

cat: test.txt :No such file or directory

তবে ত্রুটি। টেক্সট ফাইলটি খালি থাকবে কারণ আমরা স্টডআউটকে স্টাডার নয় এমন একটি ফাইলে পুনঃনির্দেশ করি।

সুতরাং আমাদের ফাইল বর্ণনাকারী (একটি ফাইল বর্ণনাকারী এর চেয়ে বেশি কিছু নয় যে কোনও ইতিবাচক পূর্ণসংখ্যা যা একটি ওপেন ফাইলকে উপস্থাপন করে You আপনি ডেস্ক্রিপ্টর বলতে পারেন ফাইলের অনন্য আইডি) শেলকে বলতে যে আমরা কোন ধরণের আউটপুট ফাইলটি প্রেরণ করছি Un ইউনিক্স / লিনাক্স সিস্টেমে 1 স্টাডাউটের জন্য এবং 2 স্টাডারের জন্য

সুতরাং এখন যদি আপনি এর

ls -a 1> output.txtঅর্থ এটি করেন তবে আপনি আউটপুট.টিএসএক্সটিতে স্ট্যান্ডার্ড আউটপুট (স্টডআউট) প্রেরণ করছেন।

এবং যদি আপনি এর

cat test.txt 2> error.txtঅর্থ এটি করেন তবে আপনি স্ট্যান্ডার্ড ত্রুটি (stderr) এ ত্রুটি পাঠাচ্ছেন to txt।

&1ফাইল বর্ণনাকারী 1 (stdout) এর মান উল্লেখ করতে ব্যবহৃত হয়।

এখন বিন্দুটির 2>&1অর্থ হ'ল "স্টাডারকে একই জায়গায় পুনর্নির্দেশ করুন আমরা স্টাডআউটকে পুনর্নির্দেশ করছি"

এখন আপনি এটি করতে পারেন

cat maybefile.txt > output.txt 2>&1

উভয় স্ট্যান্ডার্ড আউটপুট (stdout) এবং স্ট্যান্ডার্ড ত্রুটি (stderr) আউটপুট.টেক্সটে পুনঃনির্দেশিত হবে।

নির্দেশ করার জন্য ওন্দ্রেজ কে। কে ধন্যবাদ


1
কেবলমাত্র লিঙ্কের উত্তরগুলি সমস্যাযুক্ত। উত্তরটি অকেজো বলে রেকর্ডিং লিঙ্কটি অচল হয়ে যেতে পারে। আপনার নিজের উত্তরে সর্বদা যথেষ্ট বিশদ অন্তর্ভুক্ত করা উচিত।
ওন্দ্রেজ কে।

7

মানুষ সবসময় মনে রাখবেন paxdiablo সম্পর্কে ইঙ্গিত নির্দেশক বর্তমান ফেরৎ টার্গেটের অবস্থান ... এটা হল গুরুত্বপূর্ণ।

2>&1অপারেটরের জন্য আমার ব্যক্তিগত স্মৃতিচারণ এটি হ'ল:

  • &অর্থ হিসাবে ভাবুন 'and'বা 'add'(চরিত্রটি একটি এম্পারস - এবং , তাই না?)
  • সুতরাং এটি হয়ে: 'পুনর্নির্দেশ 2(দ্বারা stderr) যেখানে 1(stdout- এ) ইতিমধ্যে / বর্তমানে এবং যোগ উভয় স্ট্রিম'

একই স্মৃতিবিজ্ঞান অন্যান্য ঘন ঘন ব্যবহৃত পুনঃনির্দেশের জন্যও কাজ করে 1>&2:

  • &অর্থ চিন্তা করুন andবা add... (আপনি এম্পারস্যান্ড সম্পর্কে ধারণা পেয়েছেন, হ্যাঁ?)
  • সুতরাং এটি হয়ে: 'পুনর্নির্দেশ 1(stdout- এ) যেখানে 2(দ্বারা stderr) ইতিমধ্যে / বর্তমানে এবং যোগ উভয় স্ট্রিম'

এবং সবসময় মনে রাখবেন: আপনি (, 'শেষ থেকে' পুনঃনির্দেশগুলি শৃঙ্খল পড়তে বাঁদিকে ডান দিক থেকে না বাঁ দিক থেকে ডানদিকে)।


7

পুনর্নির্দেশ ইনপুট

ইনপুটটির পুনঃনির্দেশের ফলে ফাইলটির নাম ফাইলের বর্ণনাকারী এন পড়ার জন্য শব্দের প্রসার থেকে ফলাফল খোলা হয় বা n নির্দিষ্ট না করা থাকলে স্ট্যান্ডার্ড ইনপুট (ফাইল বর্ণনাকারী 0) causes

পুনর্নির্দেশ ইনপুট জন্য সাধারণ ফর্ম্যাট হয়:

[n]<word

পুনর্নির্দেশ আউটপুট

আউটপুট পুনর্নির্দেশের ফলে ফাইলটির নাম ফাইলের বর্ণনাকারী এন-তে লেখার জন্য শব্দের প্রসার থেকে ফলাফল খোলা হয় বা n নির্দিষ্ট না হলে স্ট্যান্ডার্ড আউটপুট (ফাইল বর্ণনাকারী 1) তৈরি করে causes ফাইল উপস্থিত না থাকলে, এটি তৈরি করা হয়; যদি এটি বিদ্যমান থাকে তবে এটি শূন্য আকারে কাটা হবে।

পুনঃনির্দেশ আউটপুট জন্য সাধারণ ফর্ম্যাট হয়:

[n]>word

ফাইল বর্ণনাকারী সরানো

পুনঃনির্দেশ অপারেটর,

[n]<&digit-

ফাইল বর্ণনাকারী অঙ্কটি ফাইল বর্ণনাকারী এন, বা স্ট্যান্ডার্ড ইনপুট (ফাইল বর্ণনাকারী 0) এ সরিয়ে দেয় যদি n নির্দিষ্ট না করা থাকে। অঙ্কটি এন-তে সদৃশ হওয়ার পরে বন্ধ হয়ে যায়।

একইভাবে, পুনর্নির্দেশ অপারেটর

[n]>&digit-

ফাইল বর্ণনাকারী অঙ্কটি ফাইল বর্ণনাকারী এন, বা স্ট্যান্ডার্ড আউটপুট (ফাইল বর্ণনাকারী 1) এ সরিয়ে দেয় যদি n নির্দিষ্ট না করা হয়।

সূত্র:

man bash

বিভাগে /^REDIRECTসনাক্ত করতে টাইপ করুন redirection, এবং আরও শিখুন ...

একটি অনলাইন সংস্করণ এখানে: 3.6 পুনর্নির্দেশগুলি

পুনশ্চ:

manলিনাক্স শেখার জন্য অনেক সময় ছিল শক্তিশালী সরঞ্জাম।


6

প্রদত্ত যা /fooআপনার সিস্টেমে বিদ্যমান নেই এবং /tmpকরে…

$ ls -l /tmp /foo

এর সামগ্রীগুলি মুদ্রণ করবে /tmpএবং এর জন্য একটি ত্রুটি বার্তা প্রিন্ট করবে/foo

$ ls -l /tmp /foo > /dev/null

এর সামগ্রীগুলি প্রেরণ করবে এবং এর /tmpজন্য /dev/nullএকটি ত্রুটি বার্তা প্রিন্ট করবে/foo

$ ls -l /tmp /foo 1> /dev/null

ঠিক একই কাজ করবে ( 1 টি নোট করুন )

$ ls -l /tmp /foo 2> /dev/null

এর বিষয়বস্তু মুদ্রণ /tmpএবং ত্রুটি বার্তা প্রেরণ করবে/dev/null

$ ls -l /tmp /foo 1> /dev/null 2> /dev/null

উভয়টি তালিকার পাশাপাশি ত্রুটি বার্তা প্রেরণ করবে /dev/null

$ ls -l /tmp /foo > /dev/null 2> &1

শর্টহ্যান্ড


5

এটি স্ট্যান্ডআউট বা টার্মিনালে ত্রুটিটি পাস করার মতো।

এটি cmdকোনও আদেশ নয়:

$cmd 2>filename
cat filename

command not found

ত্রুটিটি এভাবে ফাইলে প্রেরণ করা হয়:

2>&1

স্ট্যান্ডার্ড ত্রুটি টার্মিনালে প্রেরণ করা হয়।


1

ইনপুট জন্য 0, স্টাডআউট জন্য 1 এবং stderr জন্য 2।

একটি টিপ : somecmd >1.txt 2>&1সঠিক, যদিও কোনও প্রভাব ছাড়াই somecmd 2>&1 >1.txtসম্পূর্ণ ভুল !


1

unix_commands 2>&1

এটি টার্মিনালে ত্রুটিগুলি প্রিন্ট করতে ব্যবহৃত হয়।

নিম্নলিখিত প্রক্রিয়াটি চিত্রিত করে

  • ত্রুটিগুলি উত্পাদিত হওয়ার পরে এগুলি স্ট্যান্ডার্ড ত্রুটি মেমরি ঠিকানা &2"বাফার" এ লেখা হয় , যার থেকে স্ট্যান্ডার্ড ত্রুটি প্রবাহের 2রেফারেন্স।
  • যখন আউটপুট উত্পাদিত হয়, এটি স্ট্যান্ডার্ড আউটপুট মেমরি অ্যাড্রেস &1"বাফার" এ লেখা হয় , যা থেকে স্ট্যান্ডার্ড আউটপুট স্ট্রিমের 1রেফারেন্স।

সুতরাং unix_commandsস্ট্যান্ডার্ড ত্রুটি স্ট্রিমটি 2ধরুন >এবং স্ট্রিমটিকে (ত্রুটিগুলির) স্ট্যান্ডার্ড আউটপুট মেমরি ঠিকানায় পুনর্নির্দেশ করুন &1, যাতে সেগুলি টার্মিনালে প্রবাহিত হবে এবং মুদ্রিত হবে।

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