আমার প্রশ্নটি পুনঃনির্দেশের অগ্রাধিকার সম্পর্কে বাশ। মনে করুন আপনার একটি আদেশ রয়েছে:
cmd1 < cmd2 > cmd3
এটি অনুবাদ করতে হবে:
(cmd1 < cmd2) > cmd3
অথবা
cmd1 < (cmd2 > cmd3)
আমার প্রশ্নটি পুনঃনির্দেশের অগ্রাধিকার সম্পর্কে বাশ। মনে করুন আপনার একটি আদেশ রয়েছে:
cmd1 < cmd2 > cmd3
এটি অনুবাদ করতে হবে:
(cmd1 < cmd2) > cmd3
অথবা
cmd1 < (cmd2 > cmd3)
উত্তর:
POSIX মান নির্দিষ্ট করে যে শেল ফেরৎ থেকে ডানে বামে হয়; যে, অর্ডার উল্লেখযোগ্য:
কনস্ট্রাক্ট
2>&1প্রায়ই মান আউটপুট একই ফাইলে মান ত্রুটি পুনর্নির্দেশ করতে ব্যবহৃত হয়। যেহেতু পুনর্নির্দেশগুলি শেষ হতে শুরু করে, তাই পুনঃনির্দেশগুলির ক্রমটি উল্লেখযোগ্য। উদাহরণ স্বরূপ:ls > foo 2>&1ফাইলের জন্য স্ট্যান্ডার্ড আউটপুট এবং স্ট্যান্ডার্ড ত্রুটি উভয়কেই নির্দেশ দেয়
foo। যাহোক:ls 2>&1 > fooকেবল স্ট্যান্ডার্ড আউটপুট ফাইলকে নির্দেশ দেয়
fooকারণ স্ট্যান্ডার্ড আউটপুট ফাইলের দিকে পরিচালিত হওয়ার আগে স্ট্যান্ডার্ড আউটপুটটিকে স্ট্যান্ডার্ড আউটপুট হিসাবে নকল করা হয়েছিলfoo।
bash মান এই অংশ মেনে কাজ করে:
$ ls doesnotexist > foo 2>&1
$ cat foo
ls: cannot access doesnotexist: No such file or directory
$ ls doesnotexist 2>&1 > foo
ls: cannot access doesnotexist: No such file or directory
$ cat foo
$
পাইপিং হিসাবে:
স্ট্যান্ডার্ড ইনপুট বা স্ট্যান্ডার্ড আউটপুট বা উভয়ই পাইপলাইন অ্যাসাইনমেন্ট পুনঃনির্দেশের আগে সংঘটিত হওয়ার কারণে এটি পুনঃনির্দেশ দ্বারা পরিবর্তন করা যেতে পারে। উদাহরণ স্বরূপ:
$ command1 2>&1 | command2উভয় মান আউটপুট এবং আদর্শ ত্রুটি পাঠায়
command1মান ইনপুটcommand2।
ls > foo 2>&1মানে স্টুডাউটকে ফুতে পুনর্নির্দেশ করা উচিত নয় তারপর স্টাডারের স্টাডাউটে পুনর্নির্দেশ করা উচিত । সুতরাং এটি কাজ করা উচিত নয়। একইভাবে দ্বিতীয় কমান্ড কাজ করা উচিত। আমি এখানে কি মিস করছি?
bashসাধারণত এখানে বর্ণিত পরিস্থিতি বাদে পোসিক্স অনুগত , যেখানে ডিফল্ট bashআচরণের পার্থক্য থাকে। আরও অনুসারে তৈরি করতে bash, আপনি --posixবিকল্পটি ব্যবহার করতে পারেন ।
ls > foo 2>&1মতো কাজ করে: প্রথম, স্ট্যান্ডার্ড আউটপুটটিকে পুনঃনির্দেশিত করা হয় foo, তারপরে, স্ট্যান্ডার্ড ত্রুটিটি স্ট্যান্ডার্ড আউটপুটে পুনঃনির্দেশিত হয়, যা এখন ফাইল foo। দ্বিতীয় উদাহরণটি, এর ls 2>&1 > fooমতো পরিচালিত হয়: স্ট্যান্ডার্ড ত্রুটিটি স্ট্যান্ডার্ড আউটপুটটিতে পুনর্নির্দেশের আগে স্ট্যান্ডার্ড আউটপুটে পুনঃনির্দেশিত হয় foo, সুতরাং ফাইলের দিকে পরিচালিত না হয়ে স্থানীয়ভাবে স্থানীয় ত্রুটি প্রতিধ্বনিত হয়।
ls 2>&1 >foo আপনি সম্ভবত এটি সম্পর্কে চিন্তা করতে পারেন। 'ls' থেকে স্ট্যাডার স্টাডাউটে পুনঃনির্দেশিত হয়েছে। এই হবে! স্টাডাউট সম্পর্কিত কোনও নির্দেশনা বিবেচনা না করেই যেখানে স্টাডাউটকে বর্তমানে নির্ধারিত করা হয়েছে সেখানে চলে যাবে .. (কারণ এটি তার প্রথম / প্রথম নির্দেশ ) .. তারপরে আরও একটি নির্দেশনা আসে যা বলে যে স্টাডাউট "foo" এ যাবে, এবং এটি না ... মনে রাখবেন: দ্বারা stderr আসলে হয়ে stdout- এ মধ্যে transmuted নয় .. এটা ঠিক যেখানে stdout- এ যায় হয়েছিল ডিরেক্টিভের সময় নির্ধারিত হয়। (যেমন টার্মিনাল)
আমিও অনুমান করি না। এক জোড়া বন্ধনী মানে একটি উপ-শেল। তবে এক্ষেত্রে পুনর্নির্দেশের কারণে কোনও সাব-শেল আরম্ভ করা হবে না। বাশ কেবল cmd2স্টিডিনে ফিড দেয় এবং স্টডআউটে ফিড দেয় cmd3।
আমি ভাবছি, তুমি কি এরকম কিছু বোঝাতে চাও cmd1 | cmd2 | cmd3? কারণ আপনার cmd2এবং cmd3সাধারণত "সেমিডিএস" পরিবর্তে সাধারণ ফাইল files