"3> & 1 1> & 2 2> & 3" কোনও স্ক্রিপ্টে কি করে?


69

আমি একটি স্ক্রিপ্টে এই লাইনটি দেখেছি:

DEVICE=`dialog --inputbox "Festplatten-Laufzeit auslesen. Gebe Sie das 
gewünschte Device an: " 0 70 "" 3>&1 1>&2 2>&3`

কি

3>&1 1>&2 2>&3

করছেন? আমি জানি যে 1 = stdout এবং 2 = stderr, তবে কী 3এবং এর &জন্য কী?


উত্তর:


77

সংখ্যাগুলি ফাইল বর্ণনাকারী এবং কেবলমাত্র প্রথম তিনটি (শূন্য দিয়ে শুরু) একটি মানযুক্ত অর্থ:

0 - stdin
1 - stdout
2 - stderr

সুতরাং আপনার আদেশে এই সংখ্যাগুলির প্রত্যেকটি একটি ফাইল বর্ণনাকারীকে বোঝায়। আপনি হয় কোনও ফাইলের সাথে একটি ফাইল বর্ণনাকারী পুনর্নির্দেশ করতে পারেন >বা এটির সাথে অন্য কোনও ফাইল বর্ণনাকারীকে পুনর্নির্দেশ করতে পারেন>&

3>&1আপনার কমান্ড লাইনে একটি নতুন ফাইল বর্ণনাকারী তৈরি করব এবং পুনর্চালনা করবে 1যা STDOUT। এখন 1>&2ফাইল বর্ণনাকারীটিকে 1-এ পুনর্নির্দেশ করবে STDERRএবং 2>&3ফাইল বিবরণকারীকে 2 থেকে 3 কে পুনর্নির্দেশ করবে যা এটি STDOUT

সুতরাং মূলত আপনি পরিবর্তন করেছেন STDOUTএবং STDERR, এই পদক্ষেপগুলি:

  1. একটি নতুন এফডি 3 তৈরি করুন এবং এফডি 1 এ এটি নির্দেশ করুন
  2. ফাইল বর্ণনাকারী 1 ফাইল বিবরণীতে পুনর্নির্দেশ 2। আমরা 3 মধ্যে ফাইল বর্ণনাকারী সংরক্ষণ না করা হলে আমরা লক্ষ্য হারাতে হবে।
  3. ফাইল বর্ণনাকারী 2 ফাইল বিবরণীতে পুনঃনির্দেশ 3। এখন ফাইল বিবরণকারী এক এবং দুটি স্যুইচ করা হয়।

এখন যদি প্রোগ্রামটি ফাইল বর্ণনাকারী 1-তে কিছু প্রিন্ট করে তবে এটি ফাইল বিবরণকারী 2 এবং তার বিপরীতে মুদ্রিত হবে।


আপনি বলেছেন যে "আপনার কমান্ড লাইনের 3> ও 1 একটি নতুন ফাইল বর্ণনাকারী তৈরি করবে এবং এটি 1 এ পুনর্নির্দেশ করবে যা STDOUT"। তবে 1 এর অর্থ এসটিডিএন নয়?
sofs1

19

এটি অদলবদল stdoutএবং stderr

>nameএর অর্থ আউটপুট ফাইলে পুনঃনির্দেশ করা name

>&numberএর অর্থ আউটপুট ফাইল বিবরণীতে পুনঃনির্দেশ করা number

সুতরাং &শেলটি বলতে আপনার ফাইলের নাম নয়, কোনও ফাইল বর্ণনাকারী বলতে প্রয়োজন।

একটি ফাইল বর্ণনাকারী এমন একটি সংখ্যা যা ইতিমধ্যে উন্মুক্ত ফাইলকে বোঝায়। মান বেশী 0মান ইনপুট জন্য, 1মান আউটপুট জন্য অথবা 2মান ত্রুটি জন্য। আপনি অন্য যে কোনও নম্বর ব্যবহার করতে পারেন, যা একটি নতুন ফাইল বর্ণনাকারী তৈরি করবে, ঠিক যেমন আপনি যখন একটি নতুন ভেরিয়েবল তৈরি করবেন তখন var=value

ডিফল্টরূপে, উভয় ফাইল বর্ণনাকারী 1এবং এতে 2যান /dev/tty, সুতরাং আপনি somecommand 3>&1 1>&2 2>&3যদি একটি নতুন শেল চালনা করেন তবে এটি কোনও পরিবর্তন করে না (কেবলমাত্র আপনার কাছে ফাইলের বর্ণনাকারী সংখ্যা 3 রয়েছে)।

তবে স্ক্রিপ্টের আগে কোথাও এটি এক্সিকিউটিউট (উদাহরণস্বরূপ exec 2>error.log) ব্যবহার করে একটি রিডাইরেকশন করে , বা স্ক্রিপ্টটি একটি কমান্ড লাইন দিয়ে পুনর্নির্দেশ (উদাহরণস্বরূপ ./thescript 2>error.log) সহ চালানো হয় , তবে স্ট্যাডআউট এবং স্ট্ডার অদলবদল কিছু করবে।

আপনার নির্দিষ্ট ক্ষেত্রে, স্ট্যান্ডআউট এবং স্টডার অদলবদল হওয়া কমান্ডটি হ'ল dialog। এর ম্যান পেজটি দেখছি, আমি দেখতে পাচ্ছি

Some widgets, e.g., checklist, will write text to dialog's output.
Normally that is the standard error

সুতরাং সম্ভবত যে ব্যক্তি স্ক্রিপ্টটি লিখেছেন তিনি কোনও কারণে তার পরিবর্তে dialogআউটপুট যেতে চান ।stdoutstderr

আরও দেখুন পুনঃনির্দেশগুলি অর্ডার


1

স্ক্রিপ্ট লেখক এফডি 3 সংজ্ঞায়িত করেছেন যেমন:

exec 3<> File.txt

"File.txt" খুলুন এবং এটিকে fd 3 নির্ধারণ করুন। সর্বাধিক ফাইল বর্ণনাকারী: 255

read -n 4 <&3

কেবল 4 টি অক্ষর পড়ুন।

echo -n . >&3

একটি দশমিক পয়েন্ট লিখুন।

exec 3>&-

বন্ধ

cat File.txt

==> 1234.67890


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