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


296

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

আমি উইন্ডোজ এর "ইকো অফ" এর মতো কিছু খুঁজছি ।

উত্তর:


510

নিম্নলিখিতটি নাল ডিভাইসে স্ট্যান্ডার্ড আউটপুট প্রেরণ করে (বিট বালতি)।

scriptname >/dev/null

এবং আপনি যদি সেখানে ত্রুটি বার্তাগুলি প্রেরণ করতে চান তবে একটি ব্যবহার করুন (প্রথমটি সমস্ত শেলটিতে কাজ নাও করতে পারে):

scriptname &>/dev/null
scriptname >/dev/null 2>&1
scriptname >/dev/null 2>/dev/null

এবং আপনি যদি বার্তাগুলি রেকর্ড করতে চান তবে সেগুলি দেখতে না পান তবে /dev/nullএকটি আসল ফাইল দিয়ে প্রতিস্থাপন করুন যেমন:

scriptname &>scriptname.out

সম্পূর্ণতার জন্য, উইন্ডোজ cmd.exe এর অধীনে (যেখানে "নুল" "/ dev / নাল" এর সমতুল্য), এটি হ'ল:

scriptname >nul 2>nul

8
নোট করুন যে '&>' বাশ (এবং সম্ভবত সি শেলস) থেকে অদ্ভুত; কার্ন এবং বোর্ন শেলগুলির জন্য 2> / দেব / নাল বা 2> & 1 প্রয়োজন (স্ট্যাডারকে স্টাডাউটের মতো একই জায়গায় প্রেরণ করতে)। কর্ন শেলটি '&>' এর ব্যাখ্যাকে "পটভূমিতে & পটভূমিতে চালাও, তারপরে খালি কমান্ডে i / o পুনঃনির্দেশ করুন" বলে মনে হয়।
জোনাথন লেফলার 0

2
নোট করুন যে কয়েকটি কমান্ড স্ট্যান্ডার্ড আউটপুট / ত্রুটির পরিবর্তে টার্মিনাল ডিভাইসে সরাসরি লিখে। পরীক্ষা করতে, echo foo > $(tty)স্ক্রিপ্টে রেখে চালনা করুন ./test.sh &> /dev/null- আউটপুটটি এখনও টার্মিনালে মুদ্রিত হয়। অবশ্যই আপনি যদি কোনও স্ক্রিপ্ট লিখে থাকেন যা এই জাতীয় কোনও আদেশ ব্যবহার করে না তবে অবশ্যই এটি কোনও সমস্যা নয়।
l0b0

1
@ l0b0, স্ক্রিপ্টের (বা অন্য কোনও প্রোগ্রামের) টিটি আলাদা করার কী কোনও উপায় আছে যাতে আপনার উদাহরণ নির্বিশেষে সমস্ত আউটপুট পুনঃনির্দেশিত হয়? আমি জানি স্ক্রিন এবং স্ক্রিপ্ট এ জাতীয় কিছু করতে পারে তবে উভয়ই চিকন এবং দুটি * নিক থেকে * নিক্সে পরিবর্তিত হয়।
ব্রেন্ট

সাইয়াউইনে @ ইয়াং /dev/nullবিদ্যমান, আপনার ব্যবহারের দরকার নেই nul
dimo414

47

কিছুটা এইরকম

script > /dev/null 2>&1

এটি স্ট্যান্ডার্ড আউটপুট এবং ত্রুটি আউটপুটকে প্রতিরোধ করবে , এগুলি উভয়টিতে পুনর্নির্দেশ করবে /dev/null


5
এছাড়াও যদি আপনি কিছু টাইপ করতে চান তবে &>
দিয়েও

1
যদিও আমি এটি আমার জিএস (ঘোস্টস্ক্রিপ্ট) কমান্ডে যুক্ত করছি, তবুও এটি প্রিন্ট করে **** সতর্কতা: ফাইলটিতে %% EOF চিহ্নিতকারী, বা %% EOF এর পরে আবর্জনা রয়েছে। কোন পরামর্শ?
জুরাবওয়েব

এই UNIX সিস্টেমে প্রক্রিয়া চলে না, আমি কি ছিল2>/dev/null
Alper

13

চেষ্টা

: $(yourcommand)

: "কিছুই না" এর জন্য সংক্ষিপ্ত।

$() শুধু আপনার আদেশ।


3
খুব আকর্ষণীয় তবে একটি সীমাবদ্ধতা রয়েছে: ফিরে আসা স্থিতি কোড সর্বদা 0(সাফল্য)। আসুন কমান্ড ব্যবহার করে একটি উদাহরণ দেখুন falseযা সর্বদা ফিরে আসে 1(ব্যর্থতা)। উদাহরণস্বরূপ ( echo foo | tee file ; false ) && echo barপ্রদর্শিত হয় foo। আপনার কৌতুক ব্যবহার আউটপুট দমন করতে: ( : $(echo foo | tee file ; false) ) && echo bar। তবে এটি প্রদর্শন করে barযার অর্থ রিটার্নের স্থিতি কোড 0(এটি থেকে প্রাপ্ত স্থিতি কোড নয় false)। এই উত্তর সীমাবদ্ধতা প্রদান করে আপনার উত্তর আপডেট করুন। চিয়ার্স
অলিবার

2
@ অলিব্রে, কি হবে DUMMY=$(yourcommand)? এতে আপনি উল্লেখ করেছেন এমন সীমাবদ্ধতা নেই। :)
semente

3
@ সেমেনেট পারফেক্ট: কমান্ডটি DUMMY=$( echo foo | tee file ; false ) && echo barকিছুই প্রদর্শন করে না। এবং কমান্ড DUMMY=$( echo foo | tee file ; true ) && echo barপ্রদর্শন করে bar। আপনার যদি এটির উত্তর দেওয়ার কোনও উত্তর সরবরাহ করে তবে আমাকে জানতে দিন ;-) চিয়ার্স
অলিব্রে

9

কিছু পরিস্থিতিতে উপযুক্ত হতে পারে এমন একটি বিকল্প হ'ল একটি ভেরিয়েবলের জন্য কমান্ডের ফলাফল নির্ধারণ করা:

$ DUMMY=$( grep root /etc/passwd 2>&1 )
$ echo $?
0
$ DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
1

যেহেতু বাশ এবং অন্যান্য POSIX কমান্ডলাইন দোভাষী অনুবাদক অ্যাসাইনমেন্টকে কমান্ড হিসাবে বিবেচনা করে না, বর্তমান কমান্ডের রিটার্ন কোডটি সম্মানিত।

দ্রষ্টব্য:typeset বা declareকীওয়ার্ডের সাথে অ্যাসাইনমেন্ট একটি কমান্ড হিসাবে বিবেচনা করা হয়, সুতরাং মূল্যায়িত রিটার্ন কোডটি হ'ল অ্যাসাইনাইমেন্টটি নিজেই হয় এবং সাব-শেলটিতে সম্পাদিত আদেশটি নয়:

$ declare DUMMY=$( grep r00t /etc/passwd 2>&1 )
$ echo $?
0

6

Andynormancx 'পোস্টের মতো এটি ব্যবহার করুন (আপনি যদি ইউনিক্স পরিবেশে কাজ করছেন):

scriptname > /dev/null

অথবা আপনি এটি ব্যবহার করতে পারেন (আপনি যদি উইন্ডোজ পরিবেশে কাজ করছেন):

scriptname > nul

1
আপনি উইন্ডোজ শেলের চেয়ে আসলে আরও ভাল করতে পারেন। পরিবর্তে আপনি যদি "স্ক্রিপ্টনাম> নুল" ব্যবহার করেন তবে আপনার মুছে ফেলার জন্য কোনও ফাইলও থাকবে না, কারণ "নুল" উইন্ডোজটি / dev / নাল এর সমতুল্য।
andynormancx

1
@ অ্যান্ডিনমর্ম্যাক্স: উইন্ডোজ ফাইল সিস্টেমের বিন্যাস সম্পর্কে আমি এটাই ঘৃণা করি। এটি NUL, COM1, LPT1, CON, ইত্যাদির মতো ফাইলের নাম সংরক্ষণ করে "আপনি যে ডিরেক্টরিতে রয়েছেন তা গুরুত্বপূর্ণ নয় (এমনকি আপনি যদি কোনও ফাইল-সিস্টেমে থাকেন তবে নেটওয়ার্ক শেয়ারের মতো ফাইল ফাইল থাকতে পারে)।
ড্রিমলাক্স

আমি মনে করি না যে আমি আসলে ডস ৫.x থেকে এনএলইউ ব্যবহার করেছি, যখন এই উত্তরটি দেখলাম তখন হঠাৎ মনে পড়ে গেল;)
andynormancx

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

4

লিনাক্স ডকুমেন্টেশন প্রকল্পের এই উদাহরণটি একবার দেখুন :

3.6 নমুনা: stderr এবং stdout 2 ফাইল

এটি একটি প্রোগ্রামের প্রতিটি আউটপুট একটি ফাইলে রাখবে। আপনি যদি নিরঙ্কুশ নীরবতার মধ্যে দিয়ে যাওয়ার একটি আদেশ চান তবে এটি ক্রোন এন্ট্রিগুলির জন্য কখনও কখনও উপযুক্ত।

     rm -f $(find / -name core) &> /dev/null 

এটি বলেছিল, আপনি এই সাধারণ পুনঃনির্দেশটি ব্যবহার করতে পারেন:

/path/to/command &>/dev/null

1

আপনার স্ক্রিপ্টে আপনি নিম্নলিখিত লাইনগুলিতে যোগ করতে পারেন যা আপনি জানেন যে একটি আউটপুট দিতে চলেছে:

some_code 2>>/dev/null

অন্যথায় আপনি চেষ্টা করতে পারেন

some_code >>/dev/null

1
কখনই >> টো / দেব / নাল .. কৌতূহলের বাইরে .. দেখছেন না কেন?
ফ্লোরিয়ান বার্ডেল

এটি কি সমস্ত আউটপুট দমন করে?
পিটার মর্টেনসেন

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