কমান্ড লাইনে "2> & 1" কি করে?


59

আমি জানি যে >কমান্ড লাইনে আউটপুট পুনঃনির্দেশের জন্য সাইনটি ব্যবহৃত হয়, তবে কমান্ড লাইনে ব্যবহারের ব্যাখ্যা দেয় এমন কিছু খুঁজে পেতে আমার সমস্যা হচ্ছে 2>&1। উদাহরণ স্বরূপ:

curl http://www.google.com > /dev/null 2>&1 &

উত্তর:


78

1-এর মানে মান আউটপুট (stdout- এ)। 2-এর মানে মান ত্রুটি (দ্বারা stderr)।

সুতরাং 2>&1যেখানে কখনও কখনও স্ট্যান্ডার্ড আউটপুট পাশাপাশি পুনঃনির্দেশ করা হচ্ছে সেখানে স্ট্যান্ডার্ড ত্রুটি পাঠাতে বলে। যেহেতু এটি প্রেরণ করা /dev/nullহচ্ছে কোনও আউটপুট একেবারেই উপেক্ষা করার অনুরূপ।


2
কোনও কারণ আছে যে একটি অ্যাম্পারস্যান্ড 1 এর আগে উপস্থিত হয়েছিল, তবে 2 এর আগে নয়? আমি ভেবেছিলাম & পটভূমিতে একটি চাকরি চালানোর জন্য একটি সংরক্ষিত চরিত্র, তবে আমি অনুমান করি কেবল তখনই যদি এম্পারস্যান্ড একটি কমান্ডের শেষে দীর্ঘ চরিত্র হিসাবে উপস্থিত হয় ...?
ম্যাট হাগিনস

8
কারণ 0(স্টিডিন), 1(স্টাডআউট) এবং 2(স্ট্ডার) আসলে ফাইল বর্ণনাকারী যা শেলের পুনর্নির্দেশের জন্য তাদের সামনে একটি অ্যাম্পারস্যান্ড প্রয়োজন। এটি এই ক্ষেত্রে ফাইল বর্ণনাকারীর সদৃশ করে যাতে কার্যকরভাবে দুটি প্রবাহের তথ্যের একত্র হয়ে যায়।
চিয়ালিয়ন

12
এটি এইভাবে ভাবুন: আপনার যদি কেবল অ্যাম্পারস্যান্ড ছাড়াই "1" থাকত, শেলটি "1" নামে একটি ফাইল তৈরি করে তাতে স্ট্যাডার আউটপুটটিকে পুনর্নির্দেশ করবে।
কার্লএফ

1
ঠিক আছে, একা কি তাহলে বৈধ হবে? curl http://www.google.com 2>/dev/nullকমান্ড লাইনটি কীভাবে জানতে পারে যে এখানে "2" স্ট্যাডার বলতে বোঝানো হয়েছে এবং এটি যে দ্বিতীয় প্যারামিটারটি আমি কার্ল কমান্ডটিতে যাচ্ছি তা নয়?
ম্যাট হাগিনস

1
@ ম্যাট হাগিনস: হ্যাঁ এটি stderrসরাসরি থেকে /dev/nullপরিবর্তে সমস্ত আউটপুট প্রেরণ করবে । আপনি চেষ্টা করে বাস্তবে এটি দেখতে পারেন curl, curl 1>/dev/nullএবং curl 2>/dev/nullকেবল আউটপুট পরিবর্তন দেখতে। আবার অ্যাম্পারস্যান্ড কেবলমাত্র ফাইল বিবরণকারীকে পুনঃনির্দেশ করার জন্য প্রয়োজন।
Chealion

23

TL; ড

পান http://www.google.comমধ্যে পটভূমি এবং বাতিল উভয় stdoutএবং stderr

curl http://www.google.com > /dev/null 2>&1 &

এটার মতই

curl http://www.google.com > /dev/null 2>/dev/null &

বুনিয়াদি

0, 1এবং 2মান ফাইল প্রতিনিধিত্ব বর্ণনাকারী মধ্যে POSIX অপারেটিং সিস্টেম। একটি ফাইল বর্ণনাকারী হ'ল একটি ফাইল বা সকেটের (মূলত) সিস্টেম রেফারেন্স ।

সি তে একটি নতুন ফাইল বর্ণনাকারী তৈরি করা এর মতো দেখতে পারে:

fd = open("data.dat", O_RDONLY)

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

কার্ল ফলাফল

ফেরৎ

যেমনটি আপনি বলেছেন <এবং >কোনও ফাইলের মতো একটি আদেশ থেকে আউটপুট পুনর্নির্দেশ করতে ব্যবহৃত হয়।

উদাহরণস্বরূপ, ইন ls > myfiles.txt, lsবর্তমান ডিরেক্টরিটির বিষয়বস্তু পেয়ে যায় এবং >এর আউটপুটটিকে পুনর্নির্দেশ করে myfiles.txt(যদি ফাইলটি উপস্থিত না থাকে তবে এটি তৈরি করা হয়েছে, অন্যথায় ওভাররাইট করা হয়েছে, তবে >>পরিবর্তে >আপনি ফাইলটিতে সংযোজন করার পরিবর্তে ব্যবহার করতে পারেন )। আপনি যদি উপরের কমান্ডটি চালনা করেন তবে লক্ষ্য করবেন যে টার্মিনালে কিছুই প্রদর্শিত হচ্ছে না। এর অর্থ সাধারণত ইউনিক্স সিস্টেমে সাফল্য। cat myfiles.txtস্ক্রিনে ফাইলের সামগ্রী প্রদর্শন করতে এটি পরীক্ষা করতে ।

> / দেব / নাল 2> & 1

প্রথম অংশ > /dev/nullপুননির্দেশনা stdout, যে curlজন্য এর আউটপুট /dev/null(এই এগিয়ে সম্পর্কে আরও) এবং 2>&1পুননির্দেশনা stderrকরার stdout(যা শুধু থেকে আপনাকে পুনঃনির্দেশিত করা হয় /dev/null, যাতে সবকিছু পাঠানো হবে /dev/null)।

বাম দিক 2>&1আপনাকে জানায় কী পুনঃনির্দেশিত করা হবে এবং ডান দিকটি আপনাকে জানায় কোথায়&পার্থক্য ডান দিকে ব্যবহার করা হয় stdout (1)বা stderr (2)নামে ফাইল থেকে 1বা 2। সুতরাং, 2>1একটি নতুন ফাইল তৈরি করা শেষ হবে (যদি এটি ইতিমধ্যে উপস্থিত না থাকে) 1এবং stderrফলাফলটি সেখানে ফেলে দেয়।

আপনার / dev / নাল

/dev/nullএটি একটি খালি ফাইল, এতে লেখা সমস্ত কিছু ফেলে দেওয়ার জন্য ব্যবহৃত একটি প্রক্রিয়া। সুতরাং, curl http://www.google.com > /dev/nullকার্যকরভাবে curlএর আউটপুট দমন করা হয় ।

> / দেব / নাল

তবে কেন এখনও কিছু জিনিস টার্মিনালে প্রদর্শিত হচ্ছে ?. এই না curl নিয়মিত আউটপুট এর কিন্তু পাঠানো ডেটা stderr, অগ্রগতি ও ডায়গনিস্টিক তথ্য এবং শুধুমাত্র প্রদর্শনের জন্য এখানে ব্যবহৃত ত্রুটি

curl http://www.google.com > /dev/null 2>&1উভয়ের curlআউটপুট এবং curlঅগ্রগতির তথ্য উপেক্ষা করে । ফলাফলটি টার্মিনালে প্রদর্শিত হয় না।

পরিশেষে

&শেষে আপনি একটি হিসাবে কমান্ড চালানোর জন্য শেল বলতে হয় কাজ মধ্যে পটভূমি । কমান্ডটি পর্দার আড়ালে অবিচ্ছিন্নভাবে চালিত হওয়ার সাথে সাথে প্রম্পটটি তত্ক্ষণাত্ ফিরে আসে। বর্তমান কাজগুলি দেখতে jobsআপনার টার্মিনালে টাইপ করুন। নোট করুন এটি আপনার সিস্টেমে চলমান প্রক্রিয়াগুলির থেকে পৃথকtopটার্মিনালে যারা টাইপ দেখতে ।

তথ্যসূত্র


1
এটি একটি লেআউট দৃষ্টিভঙ্গি থেকে পুরো ওয়েবসাইটের সেরা উত্তরগুলির মধ্যে একটি, ভাল সম্পন্ন!
ওমারঅথম্যান

একটা জিনিস আমি পাচ্ছি না আপনি কেন সব কিছু পাঠাতে চান /dev/null? আপনি কি curlকমপক্ষে কোথাও ফল পেতে চান না ?
স্কুবে

@ স্পুব রাইট এই ক্ষেত্রে এটি কেন আমার কাছে স্পষ্ট নয় যে ব্যবহারকারী কেন স্টাডআউট এবং স্টাডার উভয়ই বাতিল করতে চান। ওপি সম্ভবত কেবল সিনট্যাক্সের অর্থ কী তা বুঝতে চেয়েছিল।
হোর্হে বুকারান

5

2STDERR বোঝায়। 2>&1STDERR একই জায়গায় 1(STDOUT) প্রেরণ করবে ।


0

আমার অনুসরণ অনুসরণ হিসাবে বুঝতে:

আপনি যদি কেবলমাত্র পর্দায় কমান্ডের আউটপুট এবং ত্রুটির তথ্য পড়তে চান তবে কেবল লিখুন: curl http://www.google.com

এবং কিছু সময় আপনি পরে পর্যালোচনার জন্য টার্মিনাল স্ক্রিনের পরিবর্তে কোনও ফাইলে আউটপুট তথ্য সংরক্ষণ করতে চান, তবে আপনি লিখতে পারেন: curl http://www.google.com > logfile

তবে এইভাবে, স্ট্ডআর তথ্য বাদ দেওয়া হবে, যেহেতু >কেবলমাত্র স্টডআউটকে পুনর্নির্দেশ করা হবে logfile

সুতরাং আপনি যদি কমান্ডটির ত্রুটি সম্পর্কিত তথ্য একবার কার্যকর করতে ব্যর্থ হন তবে আপনাকে StdOr এর সাহায্যে StdOr একত্রিত করতে হবে 2>&1(যার অর্থ StdOr কে StdOut এ ভাঁজ করা উচিত), সুতরাং নিম্নলিখিত কমান্ড লাইনটি লিখিত হতে পারে: curl http://www.google.com > logfile2> & 1

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