বাশে স্টিডিন এবং স্টাডাউট পুনঃনির্দেশের অগ্রাধিকার


9

আমার প্রশ্নটি পুনঃনির্দেশের অগ্রাধিকার সম্পর্কে বাশ। মনে করুন আপনার একটি আদেশ রয়েছে:

cmd1 < cmd2 > cmd3

এটি অনুবাদ করতে হবে:

(cmd1 < cmd2) > cmd3

অথবা

cmd1 < (cmd2 > cmd3)

উত্তর:


11

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।


এটি ধরে নিয়েছে যে বাশ শেলটি পসিক্স-সম্মতিযুক্ত।
— এফএমপুরফি

1
আমি এটা পাচ্ছি না। যেহেতু আপনি বলেছেন যে অর্ডার বাম থেকে ডানে, তার ls > foo 2>&1মানে স্টুডাউটকে ফুতে পুনর্নির্দেশ করা উচিত নয় তারপর স্টাডারের স্টাডাউটে পুনর্নির্দেশ করা উচিত । সুতরাং এটি কাজ করা উচিত নয়। একইভাবে দ্বিতীয় কমান্ড কাজ করা উচিত। আমি এখানে কি মিস করছি?
— দীপক মিত্তাল

1
@fpmurphy bashসাধারণত এখানে বর্ণিত পরিস্থিতি বাদে পোসিক্স অনুগত , যেখানে ডিফল্ট bashআচরণের পার্থক্য থাকে। আরও অনুসারে তৈরি করতে bash, আপনি --posixবিকল্পটি ব্যবহার করতে পারেন ।
— ম্যাট একার্ট

@dpacmittal প্রথম উদাহরণটি, এটির ls > foo 2>&1মতো কাজ করে: প্রথম, স্ট্যান্ডার্ড আউটপুটটিকে পুনঃনির্দেশিত করা হয় foo, তারপরে, স্ট্যান্ডার্ড ত্রুটিটি স্ট্যান্ডার্ড আউটপুটে পুনঃনির্দেশিত হয়, যা এখন ফাইল foo। দ্বিতীয় উদাহরণটি, এর ls 2>&1 > fooমতো পরিচালিত হয়: স্ট্যান্ডার্ড ত্রুটিটি স্ট্যান্ডার্ড আউটপুটটিতে পুনর্নির্দেশের আগে স্ট্যান্ডার্ড আউটপুটে পুনঃনির্দেশিত হয় foo, সুতরাং ফাইলের দিকে পরিচালিত না হয়ে স্থানীয়ভাবে স্থানীয় ত্রুটি প্রতিধ্বনিত হয়।
— ম্যাট একার্ট

4
@dpacmittal .. আবার ls 2>&1 >foo আপনি সম্ভবত এটি সম্পর্কে চিন্তা করতে পারেন। 'ls' থেকে স্ট্যাডার স্টাডাউটে পুনঃনির্দেশিত হয়েছে। এই হবে! স্টাডাউট সম্পর্কিত কোনও নির্দেশনা বিবেচনা না করেই যেখানে স্টাডাউটকে বর্তমানে নির্ধারিত করা হয়েছে সেখানে চলে যাবে .. (কারণ এটি তার প্রথম / প্রথম নির্দেশ ) .. তারপরে আরও একটি নির্দেশনা আসে যা বলে যে স্টাডাউট "foo" এ যাবে, এবং এটি না ... মনে রাখবেন: দ্বারা stderr আসলে হয়ে stdout- এ মধ্যে transmuted নয় .. এটা ঠিক যেখানে stdout- এ যায় হয়েছিল ডিরেক্টিভের সময় নির্ধারিত হয়। (যেমন টার্মিনাল)
— পিটার.ও

4

আমিও অনুমান করি না। এক জোড়া বন্ধনী মানে একটি উপ-শেল। তবে এক্ষেত্রে পুনর্নির্দেশের কারণে কোনও সাব-শেল আরম্ভ করা হবে না। বাশ কেবল cmd2স্টিডিনে ফিড দেয় এবং স্টডআউটে ফিড দেয় cmd3।

আমি ভাবছি, তুমি কি এরকম কিছু বোঝাতে চাও cmd1 | cmd2 | cmd3? কারণ আপনার cmd2এবং cmd3সাধারণত "সেমিডিএস" পরিবর্তে সাধারণ ফাইল files

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