বাশ স্ক্রিপ্টে আউটপুট চুপ করে কীভাবে?


149

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

উদাহরণস্বরূপ, প্রোগ্রাম চালানো আউটপুট হবে:

% myprogram
% WELCOME TO MY PROGRAM
% Done.

আমি চাই নিম্নলিখিত স্ক্রিপ্টটি টার্মিনালে কিছু আউটপুট না করে:

#!/bin/bash
myprogram > sample.s

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


উত্তর:


187

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

# Send stdout to out.log, stderr to err.log
myprogram > out.log 2> err.log

# Send both stdout and stderr to out.log
myprogram &> out.log      # New bash syntax
myprogram > out.log 2>&1  # Older sh syntax

# Log output, hide errors.
myprogram > out.log 2> /dev/null

15
"&>" লাইনটি আমি সবেমাত্র পোস্ট করেছিলাম তার একটি সংক্ষিপ্ত সংস্করণ। আমি আগে এই শর্টকাট জুড়ে আসেনি। Upvoting।
ক্র্যাডক্লিফ

5
&>বাশ ৪ এর চেয়ে অনেক বেশি পুরানো
Ignacio Vazquez-Abram

@ IgnacioVazquez-Abrams আপনি কি সম্ভবত চেঞ্জলগ ডকুমেন্টিংয়ের &>সূচনা লিঙ্ক করতে পারেন ? : o
থারস্মমনার

1
git.savannah.gnu.org/cgit/bash.git/tree/CHANGES#n2208 ইঙ্গিত দেয় যে >>&4.0 সালে চালু হয়েছিল। এর উল্লেখ নেই &>তবে পরিবর্তনগুলি কেবল ২.০ এ ফিরে যায় তাই আমার মনে হয় এর অর্থ এটি ইতিমধ্যে 1.x এ ছিল।
ট্রিপল

git blameredir.c১৯৯৯ সালের পয়েন্টগুলিতে এখনও বর্তমান কোড বেসে সবচেয়ে পুরানো ঘটনার জন্য প্রতিশ্রুতিবদ্ধ।
ট্রিপল

60

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

এটি স্টার্ডারকে (যা ডেস্ক্রিপ্টর 2) পুনরায় ডাইরেক্ট করবে ফাইল স্ট্রিটআউট 1 যা স্টাডাউট।

2>&1

Stdout ফাইলে পুনর্নির্দেশ করুন

এখন এটি সম্পাদন করার সময় আপনি স্টডআউটটি ফাইলে পুনর্নির্দেশ করছেন sample.s

myprogram > sample.s

Stderr এবং stdout ফাইলে পুনঃনির্দেশ করুন

দুটি কমান্ডের সংমিশ্রণের ফলে স্ট্ডার এবং স্টাডআউট উভয়ই স্যাম্পল.এসে পুনঃনির্দেশিত হবে

myprogram > sample.s 2>&1

স্ট্যাডার এবং স্টাডাউটকে / dev / নাল থেকে পুনঃনির্দেশ করুন

আপনি /dev/nullযদি নিজের অ্যাপ্লিকেশনটিকে পুরোপুরি নিঃশব্দ করতে চান তবে আপনাকে পুনর্নির্দেশ করুন ।

myprogram >/dev/null 2>&1

13
সর্বশেষে একটি পুনর্নির্দেশ অপারেটর নিখোঁজ রয়েছে; এটি হওয়া উচিত myprogram >/dev/null 2>&1(পূর্বে কীলকটি /dev/nullএবং পুনঃনির্দেশগুলির ক্রমটি লক্ষ্য করুন )।
ট্রিপল

2
না myprogram &>/dev/nullযথেষ্ট হবে?
জাভিওভারফ্লো

38

সমস্ত আউটপুট:

scriptname &>/dev/null

সুবহ:

scriptname >/dev/null 2>&1

সুবহ:

scriptname >/dev/null 2>/dev/null

আরও নতুন ব্যাশের জন্য (কোনও বহনযোগ্য নয়):

scriptname &>-

এটি কাজ করে না। এটি আসলে একটি ফাইল তৈরি করে -এবং &>এটি একটি বহনযোগ্য বহনযোগ্য শেল এক্সটেনশন।
ফিল্ট

পোর্টেবল সমতুল্য echo moo 1>&-একটি ত্রুটি তৈরি করে কারণ ফাইল বর্ণনাকারী 1 বন্ধ রয়েছে:-bash: echo: write error: Bad file descriptor
ট্রিপল

11

আপনি যদি STDOUT এবং STDERR উভয়ই [সবকিছু] চান, তবে সবচেয়ে সহজ উপায় হ'ল:

#!/bin/bash
myprogram >& sample.s

তারপরে এটি চালান ./scriptএবং আপনি আপনার টার্মিনালে কোনও আউটপুট পাবেন না। :)

"> &" এর অর্থ STDERR এবং STDOUT। &একটি নল দিয়ে একই ভাবে কাজ করে: ./script |& sed যে কিন্তু সবকিছু পাঠাব


7
ম্যান বাশ ("স্ট্যান্ডার্ড আউটপুট এবং স্ট্যান্ডার্ড ত্রুটির পুনর্নির্দেশ" এর অধীনে) বলেছেন &> এবং> & সমতুল্য তবে প্রথম (&>) পছন্দ হয়। তবে | এবং পাইপগুলির জন্য এটি করার একমাত্র উপায়।
জন মেলর

1
@John না, পাইপ জন্য পোর্টেবল উপায়a 2>&1 | b 2>&1 | c
tripleee

9

আপনি যদি এখনও উত্তর খুঁজে পেতে লড়াই করে যাচ্ছেন, বিশেষত যদি আপনি আউটপুটটির জন্য একটি ফাইল তৈরি করেন এবং আপনি একটি পরিষ্কার বিকল্প পছন্দ করেন: echo "hi" | grep "use this hack to hide the oputut :) "


2
আকর্ষণীয় হ্যাক ... চতুরতার জন্য উত্সাহী ^ _ ^
skplunkerin

4

সাথে চেষ্টা করুন:

myprogram &>/dev/null

কোন আউটপুট পেতে


0

দ্রষ্টব্য: এই উত্তরটি "শেল স্ক্রিপ্ট লিনাক্স সম্পাদন করার সময় প্রতিধ্বনিকে কীভাবে বন্ধ করবেন" এই প্রশ্নের সাথে সম্পর্কিত যা ঘুরিয়ে এটিকে সদৃশ হিসাবে চিহ্নিত করা হয়েছিল।

ইকো বন্ধ করার জন্য কমান্ডটি হ'ল:

stty -echo

(এটি উদাহরণস্বরূপ; আপনি যখন কোনও পাসওয়ার্ড প্রবেশ করতে চান এবং আপনি এটি পঠনযোগ্য হতে চান না your আপনার স্ক্রিপ্টের শেষে প্রতিধ্বনি চালু রাখবেন মনে রাখবেন, অন্যথায় আপনার স্ক্রিপ্টটি চালিত ব্যক্তি সে কী দেখতে পাবে না / সে তখন থেকে টাইপ করে run রান চালানোর প্রতিধ্বনি চালু করতে:

stty প্রতিধ্বনি


0

স্ক্রিপ্টগুলিতে দরকারী:


কোনও STDOUT আড়াল করার সময় কোনও ফাইলে কেবল এসটিডিআরআর পান, এমনকি লুকানোর প্রোগ্রামটি উপস্থিত না থাকলেও (কখনও প্যারেন্ট স্ক্রিপ্টটি ঝুলিয়ে রাখে না), এই একা কাজ করছিল:

stty -echo && ./programMightNotExist 2> errors.log && stty echo

সম্পূর্ণরূপে বিচ্ছিন্ন করুন এবং সমস্ত কিছু নিঃশব্দ করুন এমনকি পিতামহী স্ক্রিপ্টটি হ্রাস করা বাতিল হবে না ./prog:

 ./prog </dev/null >/dev/null 2>&1 &

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