পুনর্নির্দেশ / দেব / নাল


144

আমি একটি উদাহরণ বাশ শেল স্ক্রিপ্ট পড়ছি:

#!/bin/bash

# This script makes a backup of my home directory.

cd /home

# This creates the archive
tar cf /var/tmp/home_franky.tar franky > /dev/null 2>&1

# First remove the old bzip2 file.  Redirect errors because this generates some if the archive
# does not exist.  Then create a new compressed file.
rm /var/tmp/home_franky.tar.bz2 2> /dev/null
bzip2 /var/tmp/home_franky.tar

# Copy the file to another host - we have ssh keys for making this work without intervention.
scp /var/tmp/home_franky.tar.bz2 bordeaux:/opt/backup/franky > /dev/null 2>&1

# Create a timestamp in a logfile.
date >> /home/franky/log/home_backup.log
echo backup succeeded >> /home/franky/log/home_backup.log

আমি এখানে "/ dev / null 2> & 1" এর ব্যবহার বোঝার চেষ্টা করছি। প্রথমদিকে, আমি ভেবেছিলাম যে এই স্ক্রিপ্টটি স্ক্রিপ্টটি ক্র্যাশ না করে (তেমনি প্রোগ্রামিং ভাষাগুলিতে যেমন ধরার ব্যতিক্রম ধরা চেষ্টা করে) ত্রুটিগুলি অগ্রাহ্য করার জন্য / dev / নাল ব্যবহার করে। কারণ আমি দেখতে পাচ্ছি না যে কীভাবে টার ফাইলের মধ্যে ডিরেক্টরিকে সংকোচনের জন্য টার ব্যবহার করা সম্ভব যে কোনও ধরণের ত্রুটির কারণ হতে পারে।


3
পুনঃনির্দেশ /dev/nullক্রাশ হওয়া রোধ করবে না, তবে স্টডআউট এবং স্টডার আউটপুট স্ট্রিমগুলি পরিষ্কার করবে। tarবিভিন্ন উপায়ে ত্রুটি ঘটতে পারে। আপনি লিখতে অ্যাক্সেস নেই, ফাইল ইতিমধ্যেই বিদ্যমান পারে, ইত্যাদি
Sparhawk

3
অপ্রয়োজনীয় আউটপুট এড়াতে কেবল একটি কৌশল। কারণ কেন টারটি ত্রুটি ঘটাতে পারে: কারণ লক্ষ্য ডিরেক্টরিটি অস্তিত্বহীন, কারণ উত্সটি নেই, কারণ আপনার লক্ষ্যটিতে লেখার অ্যাক্সেস নেই, বা tarউত্সটিতে পড়ে নেই, কারণ আপনার AT PATH তে নেই, কারণ tarক্র্যাশ হয়েছে (আপনি কখনই জানেন না), কারণ ডিভাইসে কোনও স্থান অবশিষ্ট নেই, কারণ tarসংস্করণটি পরিবর্তিত হয়েছে এবং এখন বিভিন্ন বাক্য গঠন প্রয়োজন, কারণ ডিস্কের ফলে I / O ত্রুটি হয়েছিল। আমি নিশ্চিত আপনি আরও খুঁজে পেতে পারে।
টেরডন

উত্তর:


223

না, এটি স্ক্রিপ্ট ক্রাশ হওয়া থেকে আটকাবে না। tarপ্রক্রিয়াটিতে যদি কোনও ত্রুটি দেখা দেয় (যেমন: অনুমতি অস্বীকার করা হয়েছে, এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই ...) তবে স্ক্রিপ্টটি ক্রাশ হবে।

কারণ ব্যবহার করার > /dev/null 2>&1ফলে আপনার সমস্ত কমান্ড আউটপুট (উভয় stdoutএবং stderr) এর দিকে পুনঃনির্দেশ হবে /dev/null, অর্থাত কোনও আউটপুট টার্মিনালে মুদ্রিত হয় না।

গতানুগতিক:

stdin  ==> fd 0
stdout ==> fd 1
stderr ==> fd 2

স্ক্রিপ্টে, আপনি > /dev/nullকারণগুলি ব্যবহার করুন :

stdin  ==> fd 0
stdout ==> /dev/null
stderr ==> fd 2

এবং তারপরে 2>&1:

stdin  ==> fd 0
stdout ==> /dev/null
stderr ==> stdout

3
বোঝার হিসাবে > /dev/null 2>&1, এই কমান্ডটির ফলস্বরূপ stderr ==> stdout, সুতরাং স্ট্যাডার এখনও স্টাডাউটে মুদ্রিত হবে ??
ওয়েশি জেং

11
সম্ভবত খুব গুরুত্বপূর্ণ না, কিন্তু কি fd?
কেভি


7
কেন CMD > /dev/null 2>&1কাজ করে: CMD 2>&1 > /dev/nullতবুও আমাকে এসটিডিআরআর দেয়?
dbmikus

3
প্রস্তাবিত: 2>& 1কোড উদাহরণগুলি ব্যবহার করে চাপ দেওয়ার জন্য যে নম্বর এবং এম্পারস্যান্ডটি আপনাকে পুনঃনির্দেশ অপারেটরের অংশ হিসাবে বিবেচনা করা হয়। কোনও ফাইলে পুনঃনির্দেশের মধ্যে একটি জায়গা থাকা >এবং এটির মধ্যে একটি স্পেস /path/to/fileডিস্ক্রিপ্টরের কাছে পুনর্নির্দেশ করা একই জিনিস is
হেন্ক ল্যাঙ্গভেল্ড

21

আমি এখানে "> / dev / null 2> & 1" এর ব্যবহার বোঝার চেষ্টা করছি।

(মনে রাখবেন যে আমি /dev/nullআপনার প্রশ্নের আগে পুনর্নির্দেশটি যুক্ত করেছি ))

উপরে পুনর্নির্দেশ হবে STDOUTএবং STDERRকরতে /dev/null। এটি এর STDERRমধ্যে মার্জ করে কাজ করে STDOUT। (মূলত কমান্ড থেকে সমস্ত আউটপুট নাল ডিভাইসে পুনঃনির্দেশ করা হবে ))

... স্ক্রিপ্টটি ক্রাশ না হওয়ার কারণ (প্রোগ্রামিং ভাষাগুলিতে ব্যতিক্রম হ্যান্ডলিংয়ের মতো চেষ্টা করুন)।

এটি একেবারে কোনও try/catchকিছুর মতো নয় । এটা শুধু নীরব হুকুম থেকে (ত্রুটি সহ) আউটপুট কোন ধরণের।

কারণ আমি দেখতে পাচ্ছি না যে কীভাবে টার ফাইলের মধ্যে ডিরেক্টরিকে সংকোচনের জন্য টার ব্যবহার করা সম্ভব যে কোনও ধরণের ত্রুটির কারণ হতে পারে।

এটি বিভিন্ন কারণে ত্রুটি ঘটতে পারে, সহ:

  • আপনি যে ফাইল (গুলি) সংরক্ষণাগারভুক্ত করার চেষ্টা করছেন বা যে ফাইলটিতে আপনি লেখার চেষ্টা করছেন তার অপ্রতুল অনুমতি
  • সংরক্ষণাগারটি তৈরি করতে ডিস্কের জায়গার অভাব

ভাল ব্যাখ্যা।
আদিত্য গুপ্ত

7

আপনি যখন সিএমডি> / dev / নাল 2> & 1 চালান

STDOUT / dev / null এ পুনঃনির্দেশ করে এবং তারপরে STDERR STDOUT এর ঠিকানাতে পুনর্নির্দেশ করে, যা / dev / নালকে সেট করা হয়েছে, ফলস্বরূপ STDOUT এবং STDERR উভয়ই / dev / নলের দিকে নির্দেশ করে

বিপরীতে, যখন আপনি সিএমডি 2> & 1> / dev / নাল চালান

STDERR STDOUT এর ঠিকানাতে পুনর্নির্দেশ করে (ফাইলের বর্ণনাকারী 1 সেই মুহুর্তে, বা / proc / স্বা / fd / 1), এবং তারপরে STDOUT পুনর্নির্দেশ করে / dev / নাল, তবে এসটিডিআরআর fd1 এ পুনঃনির্দেশিত রাখে !! ফলস্বরূপ STDOUT থেকে স্বাভাবিক আউটপুট বাতিল করা হয় তবে এসটিডিআরআর থেকে আসা ত্রুটিগুলি এখনও কনসোলে লেখা হচ্ছে।


-2

বাশ আমি / হে পুনঃনির্দেশ

বিষয়গুলি পরিষ্কার করার মূল ধারণাটি হ'ল:

পুনর্নির্দেশগুলি ইংরেজী স্পিকারদের সাধারণত পঠিতভাবে পড়ার বিপরীতে, ডান দিক থেকে বাম দিকে প্রয়োগ করা হয়।


সুতরাং এই কোড:

command > filename 2>&1

প্রথমে পুনর্নির্দেশ stderrকরে ( ) এবং তারপরে (পুনঃনির্দেশিত সহ ) প্রেরণ করে ( )। এখানে ABSG ব্যাখ্যার (Ch। 20) দেওয়া আছেstdout 2>&1stdoutstderrfilename> filename

এই কোড:

command >>/dev/null 2>&1

পুননির্দেশনা stderrএবং stdoutকরতে /dev/null... যা মানে কোথাও না । প্রেরিত জিনিসগুলি /dev/nullকোনওভাবেই সংরক্ষণ করা হয় না, ক্যাশে হয় না বা মনে রাখা হয় না।

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


আমি এই ধরণের প্রশ্নটি বেশ খানিকটা দেখতে পাই ... মূলত কারণ বছরগুলিতে কোডিং না করায় আমাকে এটিকে নিজেরাই সন্ধান করতে হয়েছিল। এবিএসজি থেকে কিছু সহজ তথ্য এখানে দেওয়া হয়েছে:

"পুনঃনির্দেশের অর্থ হ'ল কোনও ফাইল, কমান্ড, প্রোগ্রাম বা স্ক্রিপ্ট থেকে আউটপুট ক্যাপচার করা এবং এটিকে অন্য ফাইল, কমান্ড, প্রোগ্রাম বা স্ক্রিপ্টে ইনপুট হিসাবে প্রেরণ করা।"

2>&1 
# Redirects stderr to stdout.

command >>filename 2>&1
# Appends both stdout and stderr
#+  to the file "filename" ...

ABSG: উন্নত ব্যাশ স্ক্রিপ্টিং গাইড: উপরে অধ্যায় 20 লিংক ওপেন সোর্স এর ইনপুট / আউটপুট ফেরৎ পৃষ্ঠায় একটি লিঙ্ক tldp.org ডকুমেন্ট নামক উন্নত ব্যাশ স্ক্রিপ্টিং গাইড মেন্ডেল কুপার। এটি "শেল স্ক্রিপ্টিংয়ের শিল্পের গভীর-অনুসন্ধান" হিসাবে তালিকাভুক্ত এবং আমি একেবারেই সম্মত। এটি একটি ভয়ঙ্কর সংস্থান এবং এর সকল ধরণের উন্মাদ পরিস্থিতির জন্য প্রচুর উত্তর রয়েছে।

অন্যান্য মূল্যবান সম্পদ: সেখানে কি বর্তমান / রক্ষণাবেক্ষণ বিভাগে অনেক মূল্যবান সম্পদ (HTML, পিডিএফ, টেক্সট, ইত্যাদি মত বিভিন্ন কুশলী বিন্যাসে) উপর লিনাক্স ডকুমেন্টেশন প্রজেক্ট নির্দেশিকা পাতা। এখানে আমি কয়েকটি দরকারী খুঁজে পেয়েছি:


1
না, পুনর্নির্দেশগুলি ডান থেকে ডানদিকে পরিচালিত হয়। আপনার উদাহরণে, স্ট্যান্ডার্ড আউটপুট এতে পুনঃনির্দেশিত হয় filename, তবে স্ট্যান্ডার্ড ত্রুটি যেখানে স্ট্যান্ডার্ড আউটপুট বর্তমানে চলছে (সেখানে filename) to যদি এটির বিপরীতে থাকে তবে স্ট্যান্ডার্ড ত্রুটিটি টার্মিনালে শেষ হবে যখন কেবল স্ট্যান্ডার্ড আউটপুটটিতে পুনঃনির্দেশ করা হয়েছিল filename। এছাড়াও, মধ্যে command >file1 2>file2, file2যদি তৈরি করা হবে file1(কিনা কোন ব্যাপার তৈরি করা যেতে পারে file1এবং file2আসলে সম্পূর্ণ ভিন্ন pathnames ছিল)।
কুসালানন্দ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.