কীভাবে প্রোগ্রামগুলি STDOUT / STDERR এর চেয়ে অন্য কোথাও যায়? কীভাবে এড়ানো যায়?


15

স্পষ্টতই আমি ব্যবহারের জন্য উপলব্ধ সমস্ত আউটপুট গন্তব্য জানি না। আমি stdout( &1) এবং stderr( &2) সম্পর্কে জানি । যাইহোক, উভয় বর্ণনাকারী পুনর্নির্দেশের পরে, আমি মাঝে মাঝে এখনও আমার কনসোলে কিছু আউটপুট পাই!

আমি সবচেয়ে সহজ উদাহরণটি মনে করতে পারি জিএনইউ সমান্তরাল; প্রতিবার আমি এটি ব্যবহার করার সময়, আমি একটি উদ্ধৃতি বিজ্ঞপ্তি দেখতে পাই। আমি যখন করি &2>1 > fileতখনও আমি নোটিশটি দেখতে পাই।

এবং এটি একই ক্ষেত্রে প্রযোজ্য emerge: যখন আমি দৌড়তে দৌড়ে যাই এবং কিছু সমস্যা হয় তখন কিছু তথ্য মুদ্রিত হয় stdoutনা এবং stdinযেহেতু আমি সেগুলি পুনঃনির্দেশ করি এবং সেগুলি এখনও পেরে যায়।

আমি বেশিরভাগ ব্যবহার করে এই সমস্যাগুলি সমাধান করি script, তবে আমি এখনও ভাবছি যে এই সমস্যাটি কী কারণে ঘটছে।


1
একটি সম্পূর্ণ উদাহরণ প্রদান করুন ।
কুসালানন্দ

কোন শেল? কটাক্ষপাত আছে mywiki.wooledge.org/BashFAQ/055 এবং stackoverflow.com/questions/876239/...
Sundeep

8
আপনি তাদের সব পাবেন না । একটি স্ক্রিপ্ট সর্বদা লিখতে পারে /dev/tty
স্যাটাস কাতসুরা

1
জিএনইউ হিসাবে parallel: mkdir ~/.parallel; touch ~/.parallel/will-citeবিরক্তিকর বার্তা অক্ষম করবে। বিকল্পভাবে, এর অন্যান্য বাস্তবায়নের জন্য চারদিকে নজর দিন parallel
সাটস কাতসুরা

2
@ ওলেট্যাঞ্জ কারণ এটি কোনও সমস্যা নয় - আমি জিজ্ঞাসা করছি কেন কিছু ঘটছে এবং আমি parallelউদাহরণ হিসাবে ব্যবহার করছি ।
ম্যাথিউরক

উত্তর:


40

আপনার ব্যবহৃত সিনট্যাক্সটি ভুল।

cmd &2>1 >file

হিসাবে বিভক্ত হবে

cmd &
2>1 >file

এটা হবে:

  1. cmdকোনও পুনঃনির্দেশ ছাড়াই পটভূমি কাজ হিসাবে চালান
  2. একটি পৃথক প্রক্রিয়াতে (কমান্ড ছাড়াই!) stderrআক্ষরিক নামে পরিচিত একটি ফাইলের দিকে পুনর্নির্দেশ হবে 1এবং এতে পুনর্নির্দেশ stdoutহবেfile

আপনি যে সিনট্যাক্সটি চান তা হ'ল:

cmd >file 2>&1

ক্রম ক্রম গুরুত্বপূর্ণ। এটা হবে:

  1. পুনঃনির্দেশ stdoutকরুনfile
  2. পুনঃনির্দেশ stderrকরুন &1- যেমন একই ফাইল হ্যান্ডেলstdout

ফলাফলটি হ'ল উভয়ই stderrএবং stdoutপুনঃনির্দেশিত হবে file

ইন bash, একটি সাধারণ অ-মানক (এবং তাই আমি বহনযোগ্যতার ভিত্তিতে এটির প্রস্তাব দিই না) সিনট্যাক্স cmd &> fileএকই জিনিসটি করে।


সুন্দর ধন্যবাদ. অন্য সমস্যাটি হতে পারে /dev/tty, তবে আশা করি এটি খুব ঘন ঘন ঘটে না (যদি তা হয় তবে)।
ম্যাথিউরক

5
atআপনার মেশিনে যদি কমান্ড থাকে এবং এটির ব্যবহার করার সুযোগ থাকে তবে আপনি কমান্ডটি চালাতে পারেন at now। বিশদ জন্য ম্যানপেজ দেখুন। এটি একটি ব্যাচ প্রক্রিয়া প্রক্রিয়াটির মাধ্যমে কমান্ডটি চালাবে এবং প্রক্রিয়াটি কখনই লেখার মতো tty থাকবে না। তবে, সাধারণভাবে, আমি এই প্রান্তের মামলাটি নিয়ে চিন্তা করব না। সাধারণত কেবলমাত্র প্রক্রিয়াগুলির জন্য মিথস্ক্রিয়া প্রয়োজন হয় এবং ইচ্ছাকৃতভাবে ব্যবহারকারীদের পুনঃনির্দেশ ব্যবহার করার পরেও জিনিসগুলি প্রদর্শন করা প্রয়োজন /dev/tty
স্টিফেন হ্যারিস

সেখানে
গিয়েছেন

10

দুটি সমস্যা আছে।

প্রথমটি হ'ল অর্ডারটি গুরুত্বপূর্ণ, দ্বিতীয়টি /dev/tty

আসুন এই স্ক্রিপ্টটিকে উদাহরণ স্ক্রিপ্ট হিসাবে ব্যবহার করুন যা থেকে আমরা আউটপুট ক্যাপচার করতে চাই:

test.sh:

#!/bin/bash

echo dada
echo edada 1>&2
echo ttdada >/dev/tty

এখন আসুন কমান্ডগুলির ফলাফলগুলি দেখুন:

./testmyscript.sh 2>&1 >/dev/null:

edada
ttdada

মূল্যায়নের ক্রমটি বাম থেকে ডানে হওয়ায় আমরা প্রথমে " stderrযেখানেই stdoutআউটপুটিং (তাই কনসোল আউটপুট) যাচ্ছি সেখানে পুনর্নির্দেশ" পাই । তারপর আমরা "পুনর্নির্দেশ পেতে stdoutথেকে /dev/nullআমরা এই ধরনের পরিস্থিতির সঙ্গে শেষ পর্যন্ত।

stdout-> /dev/null stderr-> কনসোল

সুতরাং আমরা এটি সঠিকভাবে পেয়েছি:

./testmyscript.sh >/dev/null 2>&1

এবং আমরা পেতে:

ttdada

এখন আমরা "পুনর্চালনা না stdoutকরতে /dev/null", এবং তারপর "পুনর্চালনা যেখানে stdout- এ নির্দেশ না দ্বারা stderr" (তাই হয়, /dev/null)। Hurray থেকে!

তবে, আমাদের এখনও একটি সমস্যা রয়েছে; প্রোগ্রাম প্রিন্ট /dev/tty। এই ধরণের আচরণটি কীভাবে ঠিক করতে হবে তা আমি এখন জানি না, সুতরাং আপনার সম্ভবত খুব বেশি প্রয়োজন হতে পারে scriptতবে আশাকরি এই আচরণটি খুব ঘন ঘন ঘটে না।

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