কিছু লিনাক্স প্রোগ্রামের আউটপুট কেন STDOUT বা STDERR- তে যায় না?


21

কিছু লিনাক্স প্রোগ্রামের আউটপুট কেন STDOUT বা STDERR- তে যায় না?

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

একটি উদাহরণ 'সময়' আদেশ:

time sleep 1 2>&1 > /dev/null

real        0m1.003s
user        0m0.000s
sys         0m0.000s

অথবা

time sleep 1 &> /dev/null

real        0m1.003s
user        0m0.000s
sys         0m0.000s

কেন আমি উভয় বার আউটপুট দেখতে পাচ্ছি? আমি প্রত্যাশা করেছি যে এগুলি সবগুলি / dev / নালায় ফেলে দেওয়া হবে

কোন আউটপুট স্ট্রিমটি সময় ব্যবহার করছে এবং আমি কীভাবে এটি একটি ফাইলে পাইপ করতে পারি?

সমস্যাটি ঘিরে কাজ করার একটি উপায় হ'ল বাশ স্ক্রিপ্ট তৈরি করা , উদাহরণস্বরূপ, combine.shএই আদেশটি সহ:

$@ 2>&1

তারপরে 'সময়' এর আউটপুট সঠিক উপায়ে ক্যাপচার করা যায়:

combine.sh time sleep 1 &> /dev/null

(কোনও আউটপুট দেখা যায় না - সঠিক)

পৃথক কম্বাইন স্ক্রিপ্ট ব্যবহার না করে যা চাই তা অর্জন করার কোনও উপায় আছে?


3
প্রথমে আপনার ক্রমটি বিপরীত করা উচিত: এর 2>&1 > /dev/nullঅর্থ "2 এখন 1 যেখানে যায় (যেমন, টার্মিনালটি ডিফল্টরূপে), এবং তারপরে 1 এখন / dev / নাল যায় (তবে 2 এখনও টার্মিনালে যায়!) >/dev/null 2>&1বলতে ব্যবহার করুন "1 এখন / দেব / নাল যায়, তারপরে 2 যায় যেখানে 1 যায় (অর্থাত্ / দেব / নালও যায়)। এটি এখনও এখানে কাজ করবে না কারণ অন্তর্নির্মিত 'সময়' পুনঃনির্দেশিত হবে না, তবে আরও সাধারণভাবে সঠিক (উদাহরণস্বরূপ আপনি / usr / bin / সময় ব্যবহার করলে এটি কাজ করবে)। "2> & 1" সম্পর্কে 1 এর "দিকনির্দেশ" কে 2 তে অনুলিপি হিসাবে ভাবুন, 2 তে 1 তে যাচ্ছেন না
অলিভিয়ার ডুলাক

উত্তর:


38

এই প্রশ্নটি বাশফ্যাউ / 032 তে সম্বোধন করা হয়েছে । আপনার উদাহরণে, আপনি:

{ time sleep 1; } 2> /dev/null

কারণ কেন

time sleep 1 2>/dev/null

আপনি যেভাবে প্রত্যাশা করছেন তা আচরণ করে না কারণ সেই বাক্য গঠনটির সাথে আপনি timeকমান্ডটি চাইবেন sleep 1 2>/dev/null(হ্যাঁ, স্টাডারেরsleep 1 সাথে কমান্ডটি পুনঃনির্দেশিত হয়েছে )। অন্তর্নির্মিতভাবে সেভাবে কাজ করে যাতে এটি প্রকৃত পক্ষে সম্ভব হয়।/dev/nulltime

bash Builtin কারণ ... ভাল, এটি একটি builtin আসলে এটা করতে পারেন। বহিরাগত কমান্ড timeসাধারণত অবস্থিত থাকে এমন আচরণ অসম্ভব /usr/bin। প্রকৃতপক্ষে:

$ /usr/bin/time sleep 1 2>/dev/null
$

এখন, আপনার প্রশ্নের উত্তর

কিছু লিনাক্স প্রোগ্রামের আউটপুট কেন STDOUT বা STDERR- তে যায় না?

হ'ল: এটি করে, আউটপুটটি স্টডআউট বা স্ট্ডার যায় ।

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


2
আপনি অন্যান্য এফডি তৈরি করতে পারেন এবং কমান্ডগুলি স্পষ্টভাবে তাদের কাছে যেতে পারেন (যেমন: বাশ স্ক্রিপ্টে exec 3>/some/file ; ls >&3 ;)
অলিভিয়ার ডুলাক

@ অলিভিয়ারডুলাক শিওর, বা বিল্টিন সহ আরও সহজ coproc। তবে timeবিল্টিনের ক্ষেত্রে এটি হয় না ।
gniourf_gniourf

@ গনিউরফ-গনিউরফ: আপনার বাক্যটির কারণে আমি মন্তব্য করছিলাম "আউটপুটটি স্টাডাউট বা স্টার্ডারে যায়" ^^
অলিভিয়ার ডুলাক

14

সম্পর্কে আপনার বিশেষ প্রশ্নকে timebuiltin বললেন করা হয়েছে, কিন্তু সেখানে আছে কিছু কমান্ড যে উভয় লিখুন না stdoutবা stderr। এর সর্বোত্তম উদাহরণ হ'ল ইউনিক্স কমান্ড cryptcryptকোনও যুক্তি ছাড়াই স্ট্যান্ডার্ড ইনপুট এনক্রিপ্ট stdinকরে তা স্ট্যান্ডার্ড আউটপুটে লেখায় stdout। এটা একটা পাসওয়ার্ড ব্যবহার করে লিখতে অনুরোধ getpass(), যা অক্ষমতা দ্বারা একটি প্রম্পট আউটপুট /dev/tty/dev/ttyবর্তমান টার্মিনাল ডিভাইস। লেখার সাথে /dev/ttyবর্তমান টার্মিনালে লেখার প্রভাব রয়েছে (যদি সেখানে থাকে তবে দেখুন isatty())।

এটিকে এনক্রিপ্ট করা আউটপুট cryptলেখার কারণটি লিখতে পারে না । এছাড়াও, লেখার পরিবর্তে প্রম্পট করা আরও ভাল যাতে কোনও ব্যবহারকারী যদি পুনঃনির্দেশ করে এবং , প্রম্পটটি এখনও দেখা যায়। (একই কারণে, পাসওয়ার্ডটি পড়তে পারে না , যেহেতু এটি এনক্রিপ্ট করার জন্য ডেটা পড়তে ব্যবহৃত হয়))stdoutstdout/dev/ttystderrstdoutstderrcryptstdin


2
+1 টি। ওপিটির জন্য কম প্রাসঙ্গিক, তবে সবার জন্যই বেশি প্রাসঙ্গিক "কিছু লিনাক্স প্রোগ্রামের আউটপুট এসটিডিআউট বা এসটিডিআরআর কেন যায় না?" গুগলের মাধ্যমে। :-)
রুখ

0

time sleep 1 > /dev/null 2>&1# পুনর্নির্দেশ "ঘুমের" আউটপুট শূন্য করে। তারপরে, "সময়" তার নিজস্ব আউটপুট লেখায়, কোনও পুনঃনির্দেশ ছাড়াই। এটি " time (sleep 1 > /dev/null 2>&1)" এর মতো ।

(time sleep 1) > /dev/null 2>&1 # "টাইম স্লিপ 1" চালায়, তারপরে আউটপুটটি শূন্যে পুনঃনির্দেশ করে।

[] গুলি


-1

আপনার ক্ষেত্রে সমস্যাটি হ'ল পুনঃনির্দেশটি অন্যভাবে কাজ করে। তুমি লিখেছিলে

time sleep 1 2>&1 > /dev/null

এটি স্ট্যান্ডার্ড আউটপুটটিকে পুনর্নির্দেশ করে /dev/nullএবং তারপরে স্ট্যান্ডার্ড ত্রুটিটিকে স্ট্যান্ডার্ড আউটপুটে পুনঃনির্দেশ করে।

সমস্ত আউটপুট পুনর্নির্দেশ করতে আপনাকে লিখতে হবে

time sleep 1 > /dev/null 2>&1 

তারপরে স্ট্যান্ডার্ড ত্রুটিটি স্ট্যান্ডার্ড আউটপুটে পুনঃনির্দেশিত হবে এবং তার পরে সমস্ত স্ট্যান্ডার্ড আউটপুট (মানক ত্রুটিযুক্ত) এ পুনঃনির্দেশিত হবে /dev/null


এটি ব্যাশ বিল্টিনের সাথে কাজ করে না time। কিছু ব্যাখ্যা জন্য আমার উত্তর দেখুন।
gniourf_gniourf

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