কীভাবে কোনও ফাইলে এসটিডিআরআর পুনর্নির্দেশ করবেন

পটভূমিতে চালানোর জন্য একটি কমান্ড রাখার জন্য নোহুপ ব্যবহার করার সময় কিছু সামগ্রী উপস্থিত হয় টার্মিনাল.

cp: error reading ‘/mnt/tt/file.txt’: Input/output errorcp: failed to extend ‘/mnt/tt/file.txt’: Input/output error

আমি একটি ফাইল যে বিষয়বস্তু সংরক্ষণ করতে চান.

দুটি প্রধান আউটপুট স্ট্রিম রয়েছে লিনাক্স (এবং অন্যান্য ওএস), স্ট্যান্ডার্ড আউটপুট (এসটিডিআউট) এবং স্ট্যান্ডার্ড ত্রুটি (এসটিডিআরআর). ত্রুটি বার্তা, বেশী আপনি প্রদর্শন মত, মান ত্রুটি ছাপা হয়. ক্লাসিক পুনঃনির্দেশ অপারেটর (command > file) শুধু মান আউটপুট পুননির্দেশনা, তাই মান ত্রুটি এখনও টার্মিনালে প্রদর্শিত হয়. পাশাপাশি এসটিডিআরআর পুনর্নির্দেশ করতে আপনার কয়েকটি পছন্দ রয়েছে:

  1. এসটিডিআউটকে একটি ফাইল এবং এসটিডিআরআরকে অন্য ফাইলে পুনঃনির্দেশ করুন:

    command > out 2>error
  2. একটি ফাইল ডাউনলোড করুন (>out), এবং তারপর এসটিডিআরআর এসটিডিআউটে পুনঃনির্দেশ করুন (2>&1):

    command >out 2>&1
  3. উভয় একটি ফাইলে পুনঃনির্দেশ করুন (এটি সমস্ত শেল দ্বারা সমর্থিত নয়, bash এবং zsh এটি সমর্থন করুন, উদাহরণস্বরূপ, কিন্তু sh এবং ksh না):

    command &> out

বিভিন্ন নিয়ন্ত্রণ এবং পুনঃনির্দেশ অপারেটর সম্পর্কে আরও তথ্যের জন্য, দেখুন এখানে.

খেয়াল করা প্রথম জিনিস আপনার উদ্দেশ্য এবং শেল উপর নির্ভর করে উপায়ে দম্পতি আছে, তাই এই একাধিক দিক সামান্য বোঝার প্রয়োজন. অতিরিক্ত হিসাবে, নির্দিষ্ট কমান্ড যেমন time এবং strace ডিফল্টরূপে এসটিডিআরআর-তে আউটপুট লিখুন এবং সেই কমান্ডের নির্দিষ্ট পুনঃনির্দেশের কোনও পদ্ধতি সরবরাহ করতে পারে বা নাও দিতে পারে

পুনঃনির্দেশের পিছনে প্রাথমিক তত্ত্বটি হ ' ল শেল দ্বারা উত্পন্ন একটি প্রক্রিয়া (ধরে নেওয়া এটি একটি বাহ্যিক কমান্ড এবং শেল বিল্ট-ইন নয়) এর মাধ্যমে তৈরি করা হয়েছে fork() এবং execve() সিসকলস, এবং এর আগে অন্য সিসকল ঘটে dup2() আগে প্রয়োজনীয় পুনঃনির্দেশ সম্পাদন করে execve() ঘটে. যে অর্থে, পুনঃনির্দেশগুলি পিতামাতার শেল থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়. দ্য m&>n এবং m>n.txt কিভাবে সঞ্চালন শেল অবহিত open() এবং dup2() সিসকাল (আরো দেখুন ইনপুট পুনঃনির্দেশ কীভাবে কাজ করে, পুনঃনির্দেশ এবং পাইপ মধ্যে পার্থক্য কি, এবং আউটপুট পুনঃনির্দেশ ঠিক মানে কি )

শেল পুনঃনির্দেশ

সর্বাধিক সাধারণ, মাধ্যমে হয় 2> মধ্যে বোর্ন - এর মতো শেল, যেমন dash (যা সংযুক্ত করা হয় /bin/sh) এবং bash; প্রথম ডিফল্ট এবং পজিক্স-অনুবর্তী শেল এবং অন্যান্য অধিকাংশ ব্যবহারকারীদের ইন্টারেক্টিভ সেশনের জন্য ব্যবহার কি. তারা সিনট্যাক্স এবং বৈশিষ্ট্যগুলিতে পৃথক, তবে ভাগ্যক্রমে আমাদের জন্য ত্রুটি স্ট্রিম পুনঃনির্দেশ একই কাজ করে (ব্যতীত &> অ মান এক). সিএসএইচ এবং এর ডেরাইভেটিভগুলির ক্ষেত্রে, এসটিডিআরআর পুনঃনির্দেশ বেশ সেখানে কাজ করে না.

আসুন ফিরে আসা যাক 2> অংশ. দুটি মূল বিষয় লক্ষ্য করা: > মানে পুনঃনির্দেশ অপারেটর, যেখানে আমরা একটি ফাইল খুলি এবং 2 পূর্ণসংখ্যা এসটিডিআরআর ফাইল বর্ণনাকারীর জন্য দাঁড়িয়েছে; আসলে শেল ভাষার জন্য পসিক্স স্ট্যান্ডার্ড ঠিক এইভাবে পুনঃনির্দেশকে সংজ্ঞায়িত করে অধ্যায় 2.7:

[n]redir-op word

সহজ জন্য > পুনঃনির্দেশ, দ্য 1 পূর্ণসংখ্যা জন্য বোঝানো হয় stdout, অর্থাৎ echo Hello World > /dev/null শুধু হিসাবে একই echo Hello World 1>/dev/null. উল্লেখ্য, পূর্ণসংখ্যা বা পুনঃনির্দেশ অপারেটর উদ্ধৃত করা যাবে না যে, অন্যথায় শেল যেমন তাদের চিনতে না, এবং পরিবর্তে টেক্সট আক্ষরিক স্ট্রিং হিসাবে একইরূপে. ব্যবধান হিসাবে, এটি গুরুত্বপূর্ণ যে পূর্ণসংখ্যা পুনঃনির্দেশ অপারেটরের ঠিক পাশেই, তবে ফাইলটি হয় পুনঃনির্দেশ অপারেটরের পাশে হতে পারে বা না, অর্থাত্ command 2>/dev/null এবং command 2> /dev/null ঠিক কাজ করবে.

শেলের সাধারণ কমান্ডের জন্য কিছুটা সরলীকৃত সিনট্যাক্স হবে

 command [arg1] [arg2]  2> /dev/null

এখানে কৌতুক ফেরৎ যে কোন জায়গায় প্রদর্শিত করতে পারেন. যে উভয় 2> command [arg1] এবং command 2> [arg1] বৈধ. এর জন্য নোট করুন bash শেল, সেখানে বিদ্যমান &> একই সময়ে উভয় এসটিডিআউট এবং এসটিডিআরআর স্ট্রিমগুলি পুনঃনির্দেশ করার উপায়, তবে আবার-এটি ব্যাশ নির্দিষ্ট এবং আপনি যদি স্ক্রিপ্টগুলির বহনযোগ্যতার জন্য চেষ্টা করছেন তবে এটি কার্যকর নাও হতে পারে আরও দেখুন উবুন্টু উইকি এবং >>এবং 2 এবং এএমপি; 1 এর মধ্যে পার্থক্য কী.

নোট: দ্য > পুনঃনির্দেশ অপারেটর ট্রানসেটস একটি ফাইল এবং ফাইল উপস্থিত থাকলে, এটি মুছে ফেলা হয়. দ্য 2>> যোগ করার জন্য ব্যবহার করা যেতে পারে stderr ফাইল করতে.

আপনি যদি খেয়াল করতে পারেন, > একক কমান্ডের জন্য বোঝানো হয়. স্ক্রিপ্টগুলির জন্য, আমরা বাইরে থেকে পুরো স্ক্রিপ্টের এসটিডিআরআর স্ট্রিমটি পুনর্নির্দেশ করতে পারি myscript.sh 2> /dev/null অথবা আমরা ব্যবহার করতে পারেন এক্সেক বিল্ট-ইন. এক্সিকিউট বিল্ট ইন ইন্টারেক্টিভ বা স্ক্রিপ্ট মাধ্যমে কিনা, তাই কথা বলতে, পুরো শেল সেশনের জন্য স্ট্রিম বৈদ্যুতিক তার লাগানো ক্ষমতা আছে. এর মতো কিছু

#!/bin/shexec 2> ./my_log_file.txtstat /etc/non_existing_file

এই উদাহরণে, লগ ফাইলটি দেখানো উচিত stat: cannot stat '/etc/non_existing_file': No such file or directory.

তবুও অন্য উপায় ফাংশন মাধ্যমে হয়. এএস সিন্ডারেলা তার উত্তরে উল্লিখিত, আমরা ইতিমধ্যে সংযুক্ত পুনঃনির্দেশ সহ ফাংশন ঘোষণা লিখতে পারি, এটাই

some_function(){    command1    command2} 2> my_log_file.txt

কমান্ড একচেটিয়াভাবে স্টডারারকে লেখা

কমান্ড যেমন time এবং strace তাদের আউটপুট লিখুন এসটিডিআরআর ডিফল্টরূপে. এর ক্ষেত্রে time কমান্ড, একমাত্র কার্যকর বিকল্প হ 'ল পুরো কমান্ডের আউটপুট পুনর্নির্দেশ করা , এটি হ' ল

time echo foo 2>&1 > file.txt

বিকল্পভাবে, যদি আপনি আউটপুট আলাদা করতে চান তবে সিঙ্ক্রোনাস তালিকা বা সাবশেলটি পুনঃনির্দেশিত করা যেতে পারে ( যেমন দেখানো হয়েছে সম্পর্কিত পোস্ট ):

{ time sleep 1 2> sleep.stderr ; } 2> time.txt

অন্যান্য আদেশ, যেমন strace অথবা dialog এসটিডিআরআর পুনঃনির্দেশ করার উপায় সরবরাহ করুন strace আছে -o <filename.txt> আউটপুট লেখা উচিত যেখানে ফাইলের নাম উল্লেখ করতে পারবেন, যা বিকল্প. প্রতিটি উপ-প্রসেসের জন্য একটি পাঠ্য ফাইল লেখার জন্য একটি বিকল্প রয়েছে যা strace দেখেন. দ্য dialog কমান্ড পাঠ্য ব্যবহারকারী ইন্টারফেসটি স্টেডআউটে লিখেছেন তবে আউটপুট স্টডারারে, তাই যাতে পরিবর্তনশীল তার আউটপুট সংরক্ষণ করুন (কারণ var=$(...) এবং পাইপলাইনগুলি কেবল এসটিডিআরআর গ্রহণ করে) আমাদের ফাইল বর্ণনাকারীদের অদলবদল করতে হবে

result=$(dialog --inputbox test 0 0 2>&1 1>/dev/tty);

কিন্তু উপরন্তু, আছে --output-fd পতাকা, যা আমরা ব্যবহার করতে পারেন. এছাড়া নামে পাইপ পদ্ধতি. আমি লিঙ্ক করা পোস্টটি পড়ার পরামর্শ দিচ্ছি dialog কি ঘটছে তার পুঙ্খানুপুঙ্খ বিবরণের জন্য কমান্ড.

@ টেরডন এটি আরও নির্দিষ্ট প্রশ্ন,এবং এটি সঠিকভাবে আরও নির্দিষ্ট প্রশ্নের জন্য গুগল অনুসন্ধানে প্রদর্শিত হয়, যা একটি ভাল জিনিস .

@ নরুজ হ্যাঁ, এবং এটি প্রদর্শিত হবে, এটি পরিবর্তন হবে না . কিন্তু কোন নতুন উত্তর আরো সাধারণ প্রশ্ন যেতে হবে.