&> এবং 2> & 1 এর মধ্যে পার্থক্য কী


30

সেখানে ফেরৎ দুটি ফর্ম মান আউটপুট এবং মান ত্রুটি মধ্যে মান আউটপুট । কিন্তু যা একটি ভাল? এবং কেন এটি &>নিখুঁত হিসাবে বিবেচিত হয়?

আমি পার্থক্যগুলি কী তা খুঁজে পাচ্ছি না যাতে অনেক টিউটোরিয়াল এবং এমনকি ব্যাশ ম্যানুয়াল স্টেটটি আরও &>ভাল!

সুতরাং আমি কেন ব্যবহার করব &>এবং করব না2>&1

মূলত bashশেল ব্যবহার করা


সম্পাদনা: মন্তব্যকারীদের জন্য ধন্যবাদ

কেবল> & csh বা tcsh এ কাজ করে

Ksh এ কেবল 2> & 1 টি কাজ।

ড্যাশ ব্যবহার> ফাইল 2> & 1 টি পুনর্নির্দেশ কেবল

তারপরে কোনটি ব্যবহার করতে হবে তা নিশ্চিত করতে আমার স্ক্রিপ্ট অন্যান্য সিস্টেমের সাথে সামঞ্জস্যপূর্ণ যা ব্যবহৃত শেলগুলিই হোক!


আপনার যা করার দরকার তা হ'ল আরও ভাল। এগুলি খুব আলাদা জিনিস করে। আপনি কোন শেল ব্যবহার করছেন?
স্কেপেরেন

@ স্ক্যাপারেন বাশ ব্যবহার করছেন
মেথাক্স

1
আপনি কি অর্জন করতে চান?
স্কেপেরেন

আমি কেবল জানতে চাই যে পার্থক্যগুলি কী, আমি যা চাই তা উভয় ক্ষেত্রেই হয় না তবে আমার কেবল এটির পার্থক্য কিনা তা জানতে হবে যাতে একবারের তুলনায় একবারের জন্য পূর্ব
মেথেক্স

2
&> somewhereকেবলমাত্র বাশ শর্টহ্যান্ডের জন্য > somewhere 2>&1: ব্যাশ ম্যানুয়ালটির কথায়, তারা "সিনট্যাক্যালি সমতুল্য"
স্টিল্ড্রাইভার

উত্তর:


23

বাশের ম্যান পেজে স্টাডার এবং স্টাডাউটকে পুনর্নির্দেশ করার দুটি উপায় রয়েছে : &> file এবং >& file। এখন, লক্ষ্য করুন যে এটি স্ট্ডার এবং স্টডআউট উভয়ই বলে।

এর ক্ষেত্রে >file 2>&1আমরা স্টডআউট (1) ফাইল করার জন্য পুনর্নির্দেশ করছি, তবে তারপরে স্ট্যাডারকে (2) স্টাডআউটের মতো একই জায়গায় পুনর্নির্দেশ করতেও বলছি! সুতরাং উদ্দেশ্য একই হতে পারে, তবে ধারণাটি কিছুটা আলাদা। অন্য কথায় "জন, স্কুলে যান; সুজি যান যেখানে জন যান"।

পছন্দ সম্পর্কে কি? &>একটি bashজিনিস। সুতরাং আপনি যদি কোনও স্ক্রিপ্ট পোর্ট করছেন, এটি এটি করবে না। তবে আপনি যদি 100% নির্দিষ্ট হন তবে আপনার স্ক্রিপ্টটি কেবল ব্যাশ সহ সিস্টেমে কাজ করবে - তবে এর পছন্দ নেই

এখানে উদাহরণস্বরূপ dash, ডেবিয়ান আমকিস্ট শেল যা উবুন্টুর ডিফল্ট।

$ grep "YOLO" * &> /dev/null
$ grep: Desktop: Is a directory
grep: Documents: Is a directory
grep: Downloads: Is a directory
grep: Music: Is a directory
grep: Pictures: Is a directory
grep: Public: Is a directory
grep: Templates: Is a directory
grep: Videos: Is a directory
grep: YOLO: Is a directory
grep: bin: Is a directory

আপনি দেখতে পাচ্ছেন, স্ট্যাডার পুনঃনির্দেশিত হচ্ছে না

প্রশ্নটিতে আপনার সম্পাদনাগুলি সম্বোধনের জন্য, আপনি যদি বিবৃতিটি $ শেল ভেরিয়েবলটি পরীক্ষা করে দেখতে পারেন এবং সেই অনুযায়ী পুনঃনির্দেশগুলি পরিবর্তন করতে পারেন

তবে বেশিরভাগ ক্ষেত্রে > file 2>&1কাজ করা উচিত


আরও প্রযুক্তিগত ভাষায়, ফর্মটিকে ডুপ্লিকেটিং আউটপুট ফাইল ডেস্ক্রিপ্টর[integer]>&word বলা হয় এবং এটি পসিক্স শেল কমান্ড ল্যাঙ্গুয়েজ স্ট্যান্ডার্ড দ্বারা নির্দিষ্ট একটি বৈশিষ্ট্য, যা বেশিরভাগ পসিক্স-অনুগত এবং ব্রাউন-জাতীয় শেল দ্বারা সমর্থিত।

এছাড়াও দেখুন আউটপুট পুনঃনির্দেশের ঠিক কী বোঝায়?


তারপরে অন্য কয়েকটি শাঁস ব্যবহার করার পরে কী ঘটে?
মেথক্স

zsh সমর্থন করে &>.... @ মায়থাক্স শেলগুলিতে যা সমর্থন করে না &>যেমন dashআপনার তুচ্ছ >file 2>&1পুনঃনির্দেশ ব্যবহার করা দরকার ..
হিমাইল

তারপরে কোনটি ব্যবহার করতে হবে যদি আমি নিশ্চিত হতে চাই যে আমার স্ক্রিপ্টটি বিভিন্ন শেলের সাথে সামঞ্জস্যপূর্ণ হবে
মেথক্স

3
@Maythux ব্যবহারের >file 2>&1। সমস্ত
শাঁসে

1
/etc/passwdপ্রতিটি ব্যবহারকারীর জন্য সেট করা @ টিএসজেএনচোস ১১7 শেলগুলি ইন্টারেক্টিভ শেল are সিস্টেম স্ক্রিপ্টগুলি সাধারণত dash অন্যথায় নির্দিষ্ট না করা হয় এর জন্য । ডিফল্ট কী হিসাবে, /bin/shউবুন্টুর ক্ষেত্রে এটি কী মিল আছে তা দ্বারা এটি নির্ধারিত হয় dash। আরএইচইএলে এটি হ'ল bash, ফ্রিবিএসডি-তে এটি tcsh উত্স এবং অন্য উত্স
সের্গি কলডিয়াজহনি

6

আমি সাধারণত বোর্ন-পুনরায় শেলের কাজগুলি করার পদ্ধতি অনুসরণ করার পরামর্শ দেব কারণ বাশ তাত্ক্ষণিকভাবে সবচেয়ে জনপ্রিয় ইউনিক্স শেল। বাশ সাধারণত &>বা হয় ব্যবহার করে 2>&1। আইএমএইচও, উভয়ই "নিখুঁত" নয়, তাই আমি সেই বাজে কথা ভুলে যাওয়ার পরামর্শ দিই। বাস্তবে, কোনটি আপনার ব্যবহার করা উচিত তা আপনি কী করার চেষ্টা করছেন তার উপর নির্ভর করে।

2>&1স্ট্ডআউটরের সাথে স্টার্ডারকে একীভূত করে, এটি কার্যকর হতে পারে যদি উদাহরণস্বরূপ, আপনি স্টার্ডার পাঠ্যটি পাইপ করতে চান। সুতরাং, উদাহরণস্বরূপ, যদি আপনি দেখতে চান যে কোনও প্রোগ্রাম কোনও নির্দিষ্ট স্টাডার বার্তা প্রিন্ট করে কিনা, তবে আপনার পর্দাটি (সম্ভবত) অযৌক্তিক আবর্জনায় ভরাট না চায়, আপনি এমন কিছু করতে পারেন program 2>&1 | grep crashedযা একটি প্রোগ্রাম থেকে স্টাডআউট এবং স্টডারকে অনুসন্ধান করবে "ক্র্যাশ" শব্দের জন্য "প্রোগ্রাম" নামে পরিচিত।

অন্যদিকে, আপনি যদি কোনও কিছু মুদ্রণের জন্য কোনও প্রোগ্রাম না চান, আপনি কেবল চালনা করতে পারেন program &> /dev/null, যা স্টার্ডার এবং স্টাডআউট উভয়ই / dev / নালকে পুনর্নির্দেশ করবে, একটি বিশেষ ফাইল যা ম্যাজিকভাবে জিনিসগুলি অদৃশ্য করে দেয়। অথবা, আপনি যদি কোনও প্রোগ্রামের আউটপুট সংরক্ষণ করতে চান (সম্ভবত কোনও বাগ বা কোনও কিছু জানাতে), আপনি স্ট্ডার এবং স্টডআউট উভয়ই একটি ফাইলে পুনর্নির্দেশ করতে পারেন: program &> log.txtসমস্ত ডেটা "লগ.এক্সটিএসটি" নামে ফাইলে পুনর্নির্দেশ করবে। আপনি যদি চান, আপনি stdout এবং stderr এর মাধ্যমে program 2> log.txt > log.txtবা পুনঃনির্দেশ করতে পারেন program 2>&1 | cat > log.txt, উভয়ের ব্যবহারের মতোই একই প্রভাব ফেলবে &>। আপনি যদি এমন কিছু করেন তবে program 2>&1 > fileকেবল স্টাডআউট পুনঃনির্দেশিত হবে, তবে স্ট্ডার এখনও অন্য প্রোগ্রামে পাইপ করা যেতে পারে যেমন বিড়াল, যা উপরে বর্ণিত হিসাবে পুনঃনির্দেশিত হতে পারে। তবে, টাইপিং&>উপরের উদাহরণগুলির তুলনায় আরও সহজ, যেহেতু এতে কম অক্ষর টাইপ করা জড়িত (এবং এটি মানুষের পক্ষে পড়া সহজ)। মনে রাখবেন যে program 2> log.txt > log.txtনন-ব্যাশ শেলগুলিতে আরও বেশি কাজ করার সম্ভাবনা রয়েছে।

পিএস: আপনি যদি অন্যান্য শাঁস ব্যবহার করে লোকদের সম্পর্কে উদ্বিগ্ন হন তবে আপনার স্ক্রিপ্টের প্রথম লাইনে "যাদু নম্বর" বা "শেবাং" নামক কিছু যুক্ত করতে পারেন। এটি অন্যান্য কম্পিউটারগুলি (বিশেষত যারা ইউনিক্সের মতো অপারেটিং সিস্টেমগুলি চালাচ্ছেন) কোনও স্ক্রিপ্ট কার্যকর করতে কোন প্রোগ্রামটি ব্যবহার করবেন তা জেনে রাখার জন্য এটি মূলত একটি উপায়। বিভিন্ন স্ক্রিপ্ট বিভিন্ন শেবাং ব্যবহার করে। বাশ স্ক্রিপ্টের জন্য একটি শেবাং এর মতো দেখাচ্ছে:

#!/bin/bash

আপনি যদি প্রদত্ত স্ক্রিপ্টের প্রথম লাইন হিসাবে উপরেরটি ব্যবহার করেন, তবে সাধারণত বর্ণিত স্ক্রিপ্টটি কার্যকর করতে বাশ ব্যবহার করা হবে। এটি ভুল শেলের সাহায্যে কারও জন্য দুর্ঘটনাক্রমে স্ক্রিপ্টটি কার্যকর করা আরও বেশি জটিল করে তুলবে।

পিএস: আমি মিথ্যা বলব না: এখন অবধি, আমি জানতাম না যে কেউ ব্যবহার করতে পারে >&, তবে যতদূর বাশ যায়, মনে হয় এটি একই রকম হয় &>। প্রতিদিনই আপনি কিছু নতুন শিখছেন.


যদিও আমি #!স্পষ্টভাবে অনুরোধ করার জন্য লাইন ব্যবহার সম্পর্কে আপনার সাথে একমত নই bash, এটি অন্যান্য সিস্টেমে সর্বদা পাওয়া যায় না। প্রায়শই বিকাশকারীগণ / সিসাদমিনগুলিকে এমন সিস্টেমগুলির জন্য পোর্টেবল স্ক্রিপ্টগুলি লিখতে হয় যেগুলি bashউপলভ্য নাও হতে পারে এবং এটি ইনস্টল করার জন্য তাদের নিয়ন্ত্রণেও নাও থাকতে পারে bash। এটি কেবল >file 2>&1বহনযোগ্য।
সের্গেই কোলোডিয়াজনি

আপনি উপরে একটি বিপরীত ত্রুটি করেছেন, যা আপনার দাবি বা চান এমন ফল দেয় না। স্ট্যাডারকে স্টডআউটে পুনঃনির্দেশ করুন, তারপরে স্টডআউট পাতাগুলি স্ট্ডারকে মূল স্টডআউটে পুনর্নির্দেশ করুন।
uffan1

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

উবফান 1, তথ্যের জন্য ধন্যবাদ। আমি এক মিলিয়ন বছরেও কখনও অনুমান করতে পারি নি যে বাশ স্টাডারকে সেই ক্ষেত্রে কোনও ফাইলে পুনর্নির্দেশ করবে না। অন্যদেরকেও একই ভুল হতে না দেওয়ার জন্য আমি আমার উত্তরটি সম্পাদনা করেছি।
TSJNachos117

4

থেকে ব্যাশ রেফারেন্স ম্যানুয়াল -> 3.6.4 পুনঃনির্দেশ করা হচ্ছে স্ট্যান্ডার্ড আউটপুট এবং মান ত্রুটি :

এই কনস্ট্রাক্টটি স্ট্যান্ডার্ড আউটপুট (ফাইল বর্ণনাকারী 1) এবং স্ট্যান্ডার্ড ত্রুটি আউটপুট (ফাইল বর্ণনাকারী 2) উভয়ই সেই ফাইলটিতে পুনঃনির্দেশ করার অনুমতি দেয় যার নাম শব্দের সম্প্রসারণ।

স্ট্যান্ডার্ড আউটপুট এবং স্ট্যান্ডার্ড ত্রুটির পুনর্নির্দেশের জন্য দুটি ফর্ম্যাট রয়েছে:

&>word

এবং

>&word

দুটি ফর্মের মধ্যে প্রথমটি পছন্দ করা হয়। এটি শব্দার্থগতভাবে সমান

>word 2>&1

দ্বিতীয় ফর্মটি ব্যবহার করার সময় শব্দটি কোনও সংখ্যায় বা '-' তে প্রসারিত নাও হতে পারে। যদি এটি হয় তবে অন্যান্য পুনর্নির্দেশ অপারেটরগুলি সামঞ্জস্যতার কারণে (নীচে নকল ফাইল বর্ণনাকারী দেখুন) প্রয়োগ করে।

ইনপুট এবং আউটপুট -> 4.2 এ গ্রেগের উইকির কথা উল্লেখ করা ভাল ফাইল বিবরণকারী ম্যানিপুলেশন :

সুবিধার জন্য, বাশ আপনাকে পুনর্নির্দেশের আরও একটি ফর্ম উপলব্ধ করে। &> পুনর্নির্দেশ অপারেটরটি আসলে আমরা এখানে যা করেছি তার কেবল একটি সংক্ষিপ্ত সংস্করণ [ 2>&1]; stdout এবং stderr উভয় একটি ফাইলে পুনর্নির্দেশ।


4

সুতরাং কেন আমি &> ব্যবহার করব এবং 2> & 1 ব্যবহার করব না

2>&1 মানক বোর্ন / পসিক্স শেল।

&>একটি বাশ এক্সটেনশন এবং ডি জুর স্ট্যান্ডার্ড নয় not

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

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