`কমান্ড 1> file.txt 2> file.txt` এর আচরণ কেন` কমান্ড 1> file.txt 2> এবং 1` এর থেকে আলাদা?


20

আপনি যখন stdout এবং stderr উভয়ই একই ফাইলে পুনর্নির্দেশ করতে চান, আপনি এটি ব্যবহার করে command 1>file.txt 2>&1বা এটি ব্যবহার করতে পারেন command &>file.txt। তবে command 1>file.txt 2>file.txtউপরোক্ত দুটি আদেশের চেয়ে আলাদা আচরণ কেন ?

নীচে একটি যাচাইকরণ আদেশ আছে।

$ cat redirect.sh
#!/bin/bash

{ echo -e "output\noutput" && echo -e "error" 1>&2; } 1>file.txt 2>&1
{ echo -e "output\noutput" && echo -e "error" 1>&2; } 1>file1.txt 2>file1.txt
{ echo -e "error" 1>&2 && echo -e "output\noutput"; } 1>file2.txt 2>file2.txt
{ echo -e "output" && echo -e "error\nerror" 1>&2; } 1>file3.txt 2>file3.txt
{ echo -e "error\nerror" 1>&2 && echo -e "output"; } 1>file4.txt 2>file4.txt

$ ./redirect.sh

$ echo "---file.txt---"; cat file.txt;\
echo "---file1.txt---"; cat file1.txt; \
echo "---file2.txt---"; cat file2.txt; \
echo "---file3.txt---"; cat file3.txt; \
echo "---file4.txt----"; cat file4.txt;
 ---file.txt---
output
output
error
---file1.txt---
error

output
---file2.txt---
output
output
---file3.txt---
error
error
---file4.txt----
output
rror

ফলাফল যতদূর দেখা যায়, দেখে মনে হচ্ছে দ্বিতীয় ইকো স্ট্রিংটি আপনি যখন চালাবেন তখন প্রথম প্রতিধ্বনি স্ট্রিংটি ওভাররাইট করে command 1>file.txt 2>file.txt, তবে কেন হবে তা আমি জানি না। (কোথাও রেফারেন্স আছে?)

উত্তর:


43

আপনার দুটি জিনিস জানা দরকার:

  • প্রক্রিয়াটির অ্যাপ্লিকেশন-মোডের দিকের জন্য পরিচিত একটি উন্মুক্ত ফাইল বর্ণনাকারী একটি ফাইলের বিবরণ হিসাবে পরিচিত একটি অভ্যন্তরীণ কার্নেল বস্তুর উল্লেখ করে , যা একটি খোলা ফাইলের উদাহরণ। প্রতি ফাইল প্রতি একাধিক ফাইল বিবরণ এবং একাধিক ফাইল বর্ণনাকারী একটি ফাইল বিবরণ ভাগ করে নিতে পারে।
  • বর্তমান ফাইলটি অবস্থান একটি একটি বৈশিষ্ট্য ফাইল বিবরণ । সুতরাং যদি একাধিক ফাইল বর্ণনাকারী কোনও একক ফাইলের বিবরণে ম্যাপ করে তবে তারা সকলেই একই ফাইলের বর্তমান অবস্থান ভাগ করে নেয় এবং এই জাতীয় ফাইল বিবরণকারী ব্যবহার করে প্রণীত ফাইল পজিশনে পরিবর্তন অন্যান্য ফাইল ফাইলের সমস্তকেই প্রভাবিত করে।

    এই ধরনের পরিবর্তন কলিং প্রসেস দ্বারা প্রণয়ন করা হয় read()/ readv(), write()/ writev(), lseek()এবং তাদৃশ সিস্টেম কল। echoকমান্ড কল write()/ writev()অবশ্যই।

সুতরাং যা ঘটে তা হ'ল:

  • command 1>file.txt 2>&1কেবল একটি ফাইলের বিবরণ তৈরি করে, কারণ শেলটি কেবল একবারই একটি ফাইল খোলে। শেলটি স্ট্যান্ডার্ড আউটপুট এবং স্ট্যান্ডার্ড ত্রুটি ফাইল বর্ণনাকারীদের উভয়ই সেই একক ফাইলের বর্ণনায় ম্যাপ করে। এটি স্ট্যান্ডার্ড ত্রুটিতে স্ট্যান্ডার্ড আউটপুটটিকে নকল করে । সুতরাং ফাইল বর্ণনাকারী উভয়ের মাধ্যমে একটি লেখা ভাগ করে নেওয়া বর্তমান ফাইলের অবস্থানকে সরিয়ে ফেলবে: প্রতিটি লেখাই সাধারণ ফাইলের বিবরণ আগের লেখার পরে চলে। এবং আপনি দেখতে পাচ্ছেন echoকমান্ডের ফলাফলগুলি একে অপরকে ওভাররাইট করে না।
  • command 1>file.txt 2>file.txtদুটি ফাইলের বিবরণ তৈরি করে , কারণ দুটি স্পষ্ট পুনঃনির্দেশের জবাবে শেল একই ফাইলটি দু'বার খোলে। স্ট্যান্ডার্ড আউটপুট এবং স্ট্যান্ডার্ড ত্রুটি ফাইল বর্ণনাকারী দুটি পৃথক ফাইল বর্ণনায় মানচিত্র করে, যা পরে একই একক ফাইলে মানচিত্রে পরিণত হয়। দুটি ফাইলের বর্ণনার সম্পূর্ণ স্বাধীন ফাইলের অবস্থান থাকে এবং প্রতিটি লেখাই তত্ক্ষণাত একই ফাইলের বর্ণনায় পূর্বের লেখায় যায়। এবং আপনি দেখতে পাচ্ছেন ফলাফলটি হ'ল যে কোনওটির মাধ্যমে যা লেখা থাকে তা অন্যের মাধ্যমে যা লেখা হয় তা ওভাররাইট করতে পারে, আপনি বিভিন্ন ক্রিয়াকলাপ অনুসারে আপনি লেখাগুলিকে কীভাবে নির্বাহ করেন।

আরও পড়া


1
হওয়া উচিত খোলা ফাইল বিবরণ বদলে ফাইল বিবরণ । এটি ফাইলের চেয়ে বেশি ফাইল কীভাবে খোলা হয়েছিল তার রেকর্ড সম্পর্কে আরও বেশি। এটি পসিক্স, লিনাক্স, সোলারিস এবং জিএনইউ ডকুমেন্টেশন দ্বারা ব্যবহৃত পরিভাষা termin
স্টাফেন চেজেলাস

16

ব্যবহার করে >এটি ফাইলটি ওভাররাইট করতে বলে। যেহেতু আপনি দুটি ভিন্ন ক্রিয়াকলাপে ফাইলটিতে stdout এবং stderr লেখা রয়েছে, তাই লিখতে সর্বশেষটি প্রথমটি ওভাররাইট করবে।

আপনি করতে পারেন:

command 1>>file.txt 2>>file.txt

অথবা

command &>file.txt কেবল বাশ v4 এবং তারপরে।

>> এটি ফাইল সংযুক্ত করতে বলে যাতে এটি পূর্ববর্তী ক্রিয়াকলাপগুলির আউটপুট প্রতিস্থাপন করে না।

&> লেখার সহজ উপায় 2>&1


2
কেন ls 1>&0এবং ls 0>&0এখনও এলএস এর আউটপুট দেখায়?
ইয়ভাইন

আমি বিস্মিত যে >>কাজ ব্যবহার করে। স্বাধীন অফসেটের সাথে দুটি ফাইল বিবরণে কেন এ সমস্যা নেই? @ জেডিবিপি, আপনি কি জানেন? আমি ভেবেছিলাম অ্যাপেনড মোডে একটি ফাইল খোলার বিষয়টি রাইটিং মোডে খোলার সমতুল্য, চূড়ান্ত অবস্থানের সন্ধানে, তারপরে আরও অনুসন্ধান করা অস্বীকার করে।
JoL

4
@ জেএমএমজি: অ্যাপেন্ড-মোড ফাইলগুলি সন্ধানযোগ্য, তবে প্রতিটি লেখাগুলি শেষের দিকে অন্তর্ভুক্ত অনুসন্ধানের সাথে উপসর্গযুক্ত। যে অন্তর্নিহিত সন্ধানটি পারমাণবিক কিনা তা আমার কাছে কম স্পষ্ট।
কেভিন

1
এটি সম্পূর্ণরূপে ফলো-অন প্রশ্নের উপর নির্ভর করে। এর সাথে সম্পর্কিত যাঁরা এর সাথে সম্পর্কিত যা ইঙ্গিত দেয় যে উত্তরটি অসম্পূর্ণ। এবং এটি সম্পূর্ণ সম্ভাবনাটি না জানতে চাওয়াই লোকেরা ফলো-অন প্রশ্নগুলি সন্ধান করবে না unlikely সুতরাং এটি সম্ভবত প্রশ্নগুলির ফলো করার উত্তরগুলির সদৃশ তথ্য রয়েছে এবং এটি সদৃশ হিসাবে বন্ধ হয়ে যাবে।
trlkly

1
@ কেভিন, পুরোপুরি পসিক্স-কমপ্লায়েন্ট ফাইল সিস্টেমে, অন্তর্নিহিত ও_এপপিএন্ডটি পারমাণবিক। এটি বলেছিল যে প্রতিটি ফাইল সিস্টেম প্রাসঙ্গিক শব্দার্থকগুলি যথাযথভাবে প্রয়োগ করে না - উদাহরণস্বরূপ, এনএফএস (কমপক্ষে v3 এবং পূর্ববর্তী - আমি ভি 4-তে পরিষ্কার নই) তারের প্রোটোকলে প্রাসঙ্গিক সমর্থন বেকড নেই, তাই সার্ভারটি আছে কোনও ক্লায়েন্টের সাথে কোনও ফাইল খোলা আছে তা জানার উপায় নেই O_APPEND
চার্লস ডাফি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.