কোনও আউটপুট না থাকলে কোনও আউটপুট ছাড়াই কীভাবে একটি কমান্ড চালাতে হবে run


14

কমান্ডের আউটপুটটি কীভাবে দমন করা যায় তবে কমান্ডটি প্রস্থান করে যদি ত্রুটি হয়?

উত্তর:


17

দুর্ভাগ্যক্রমে, stderrকেবলমাত্র ত্রুটি আউটপুট জন্য ব্যবহৃত অনুমানটি সবসময় সঠিক হয় না। বরং, stderrপ্রায়শই যেকোন এবং সমস্ত ইন্টারেক্টিভ আউটপুট এবং ডায়াগনস্টিক্সের জন্য ব্যবহৃত হয় , অর্থাৎ ব্যবহারকারী ইন্টারেক্টিভ প্রম্পট 1 এ পড়ার উদ্দেশ্যে তৈরি আউটপুট । wgetএবং ddসুপরিচিত উদাহরণ।

কিছু কমান্ড অ-ত্রুটিযুক্ত আউটপুট দমন করতে একটি পতাকা (যেমন -quietবা -silent) সরবরাহ করবে - তাদের ম্যান পেজগুলি পড়ুন কিনা তা দেখতে।


আরও একটি কনভেনশন যা প্রায়শই অধিষ্ঠিত হয় সেটি হ'ল প্রস্থান কোড : একটি প্রোগ্রাম যখন প্রস্থান হয় তখন একটি প্রস্থান কোড ফেরত দেয়। সাধারণত 2 , একটি প্রস্থান কোড 0সাফল্যের ইঙ্গিত দেয় এবং অন্য কোনও প্রস্থান কোড একটি ত্রুটি নির্দেশ করে।

এর সাথে bash, আপনি $?ভেরিয়েবল থেকে শেষ কমান্ডের প্রস্থান কোড পেতে পারেন । ইন fish, $statusভেরিয়েবল ব্যবহার করুন । আপনি stderrএকটি অস্থায়ী ফাইলে পাইপ করতে পারেন এবং কোনও ত্রুটি দেখা দিলে কেবল এটি মুদ্রণ করতে পারেন। উদাহরণস্বরূপ ( fish):

command 2>/tmp/outputbuffer
if $status
    cat /tmp/outputbuffer
rm /tmp/outputbuffer

আপনি কিছু শর্টকাটও ব্যবহার করতে পারেন, যদি আপনি কমান্ডগুলি শৃঙ্খলাবদ্ধ না হন:

if command 2>/tmp/outputbuffer
    cat /tmp/outputbuffer
rm /tmp/outputbuffer

বা:

command 2>/tmp/outputbuffer; or cat /tmp/outputbuffer; rm /tmp/outputbuffer;

আপনি stdoutএকই বাফারটি পাইপ করেও ব্যবহার করতে পারেন 2>&1 >/tmp/outputbuffer

(দ্রষ্টব্য: আমি আসলে জানি না fish, সুতরাং আমি এর নথিতে যা পাই তা ধারণার সাথে আমি খাপ খাইচ্ছি। বাক্য গঠনটি কিছুটা ভুল হতে পারে Also এছাড়াও, আপনি mktempএকটি অনন্য অস্থায়ী ফাইল তৈরি করতে ব্যবহার করতে পারেন - এটি চালান এবং রেকর্ডটি রেকর্ড করুন একটি চলক ফাইলের নাম।)

যদি আপনাকে একইসাথে ইন্টারেক্টিভভাবে ব্যবহার করা শেলের পটভূমিতে পুরো জিনিসটি চালানোর দরকার হয় তবে আপনি আউটপুট-আড়াল করতে এবং স্ক্রিপ্টটিকে স্ট্যান্ডার্ড কৌশলগুলি সহ পরিচালনা করার জন্য একটি স্ক্রিপ্ট লেখার চেয়ে ভাল ( fish)। হেক, আপনি নিম্নলিখিত ফাংশন এর মতো কিছু রাখতে পারেন ~/.config/fish/config.fish:

function run-silent
    set temp (mktemp)
    if $argv 2>&1 >$temp
        cat $temp
    rm $temp
end

সাথে কল করুন run-silent somecommand &(যেখানে পিছনের পিছনে &এটি পশ্চাদপটে চালিত হয়)

দ্রষ্টব্য যে এটি আসল প্রস্থান কোডটি গ্রাস করবে stdoutএবং stderrব্যর্থতার ক্ষেত্রে উভয়ই ডাম্প করে দেবে । আপনি এটি প্রয়োজনীয় হিসাবে কাস্টমাইজ করতে পারেন।


1 ত্রুটি আউটপুট প্রদর্শিত হবে না এমন গ্যারান্টি এমনকি নেই stdout- কিছু প্রোগ্রাম সেখানে সমস্ত আউটপুট ডাম্প করে দেবে!

2 দুর্ভাগ্যক্রমে, এটি এখনও সর্বদা ক্ষেত্রে হয় না - প্রস্থান কোডটি প্রোগ্রাম দ্বারা সম্পূর্ণরূপে নিয়ন্ত্রিত হয় এবং কিছু শূন্য-বহির্গমন প্রস্থান সহ কিছু সাফল্যের শর্তাদি নির্দেশ করে। আবার, ম্যানুয়ালটি পরীক্ষা করুন।


সামান্য মাছের
ঝাঁকুনি

12

ইউনিক্স ইউটিলিটিগুলিতে সাধারণ বার্তা প্রেরণ করে stdoutstderr এটিকে এবং ত্রুটি বার্তাগুলি প্রেরণ করে , সুতরাং আমরা যদি কেবল ত্রুটি বার্তাগুলি দেখতে চাই তবে এটি দমন করার পক্ষে যথেষ্ট হবে stdoutসুতরাং কেবল stderrকনসোলে আউটপুট পাওয়া যায়।

এটি করার উপায় (উভয় ক্ষেত্রে) bash এবংfish ) >/dev/nullকমান্ডের সাথে যুক্ত করা। এই পাইপগুলি অকার্যকর হয়ে যায় না, তবে স্ট্ডার (আপনার ত্রুটির বার্তাগুলি সহ) এখনও কনসোলে আসে।

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

আদেশ echo 1 >/dev/null কিছুই প্রিন্ট করে না, কারণ স্বাভাবিক stdoutআউটপুট চাপা থাকে, এবং স্টাডারকে কিছুই লেখা হয় নি।

কমান্ডটি man doesnotexist >/dev/nullএকটি ত্রুটি বার্তা প্রিন্ট করে, কারণ এতে manত্রুটি বার্তাটি লিখে দেয় stderr


2

এটি ব্যাকগ্রাউন্ডে কমান্ডটি চালাবে এবং লগ ফাইলটিতে ত্রুটিগুলি লিখবে যখন স্বাভাবিক আউটপুট উপেক্ষা করবে

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