`>> / dev / stderr` (সাদা স্থান সহ) এবং`> & 2` এর মধ্যে পার্থক্য কী?


11

ব্যাশে

আমার কী ব্যবহার করা উচিত তা নির্ধারণ করতে আমার কিছুটা সমস্যা হচ্ছে?

আমার সমস্ত স্ক্রিপ্টগুলি ">> / dev / stderr" ব্যবহার করে

বাশ প্রম্পটে, যদি আমি চেষ্টা করি:
echo test >>/dev/stderrকাজ
echo test >> /dev/stderrকরে
echo test >/dev/stderrকাজ
echo test > /dev/stderrকরে কাজ করে

echo test >>&2ব্যর্থ!
echo test >> &2ব্যর্থ!
echo test >&2কাজ
echo test > &2ব্যর্থ হয়!

আমি আমার সমস্ত স্ক্রিপ্ট এ পরিবর্তন করতে ইচ্ছুক >&2

এটি ssh (পরে su SomeUser) এর উপরও একটি বড় প্রভাব ফেলবে বলে মনে হয় যেখানে >>/dev/stderrকোনও কাজ হবে না (অনুমতি অস্বীকৃত), কেবলমাত্র >&2কাজ করবে।


আপনি ssh ত্রুটির একটি উদাহরণ দেখাতে পারেন? আমি এটি পুনরুত্পাদন করতে পারি না।
জেফ শ্যাচলার

@ জেফ শ্যাচলার আপনি ঠিকই বলেছেন, suসমস্যাটি ঘটে যাওয়ার পরেই প্রশ্নটি আপডেট করেছেন
কুম্ভ বিদ্যুৎ

@ অ্যাকোরিয়াস পাওয়ার, ... সেই বৈষম্যকে ব্যাখ্যা করার জন্য, উপায়: সাথে su -c 'some command', সেই আদেশটি চালিত হয় /bin/sh, না bash, তাই বাশ-নির্দিষ্ট আচরণ (যেমন /dev/stderrউপলভ্য না হলে পুনর্নির্দেশের উদ্দেশ্যে সিমুলেট করা) উপস্থিত থাকার গ্যারান্টি নেই।
চার্লস ডাফি

উত্তর:


22

>& nসরাসরি ফাইল বর্ণনাকারীর সদৃশ করতে শেল সিনট্যাক্স । ফাইল বর্ণনাকারী 2 স্ট্যাডার; যে কিভাবে এটি কাজ করে। আপনি কেবল স্ট্যাডারই নয়, অন্য ফাইল বর্ণনাকারীদেরও নকল করতে পারেন। আপনি এখানে অ্যাপেনড মোড ব্যবহার করতে পারবেন না কারণ কোনও ফাইল বর্ণনাকারীর সদৃশ করা কখনই ছাঁটা হয় না (যদিও আপনার স্ট্ডার একটি ফাইল হলেও) এবং >&এটি একটি টোকেন, এজন্যই আপনি এর মধ্যে কোনও স্থান রাখতে পারবেন না >& 2works তবে কাজ করে।

>> nameএকটি পৃথক অনুমোদিত সিনট্যাক্স, যেখানে nameএকটি ফাইলের নাম (এবং টোকেনটি হয় >>)। এই ক্ষেত্রে, আপনি ফাইলের নামটি ব্যবহার করছেন /dev/stderr, যা ওএস-নির্দিষ্ট হ্যান্ডলিংয়ের মাধ্যমে (লিনাক্সে, এটিতে একটি সিমলিংক /proc/self/fd/2) মানে স্ট্যান্ডার্ড ত্রুটি। স্টার্ডার একটি টার্মিনাল যখন স্ট্যান্ডার টার্মিনাল হয় তখন সংযোজন এবং কাটা মোড উভয়ই একই কাজ করে। আপনার মান ত্রুটি একটি ফাইল থাকে, তাহলে যাইহোক, এটা হবে ছেঁটে ফেলা পারে:

anthony@Zia:~$ bash -c 'echo hi >/dev/stderr; echo bye >/dev/stderr' 2>/tmp/foo
anthony@Zia:~$ cat /tmp/foo
bye

যদি আপনি /dev/stderrওভার ssh এর সাথে ত্রুটি দেখছেন তবে সার্ভার অ্যাডমিন এই সিমিলিংকে কাজ করা থেকে বিরত করে কিছু সুরক্ষা ব্যবস্থা প্রয়োগ করেছে। (যেমন, আপনি অ্যাক্সেস করতে পারবেন না /procবা /dev) or যদিও আমি প্রত্যাশা করি যেহেতু হয় সব ধরণের অদ্ভুত ভাঙ্গন সৃষ্টি করে, ডুপ্লিকেট ফাইল বিবরণকারী সিনট্যাক্স ব্যবহার করা একেবারে যুক্তিসঙ্গত (এবং সম্ভবত কিছুটা দক্ষ) পদ্ধতির। ব্যক্তিগতভাবে আমি এটি পছন্দ।


আমার আগে যে ক্ষুদ্র সমস্যাটি ছিল তার প্রতিলিপি দেওয়ার চেষ্টা করতে আমার একটি বড় সমস্যা হচ্ছে (অন্যথায় আমি এই প্রশ্নের সাথে যোগ করতাম), যে কারণে আমি সমস্ত কিছু ব্যবহার করার জন্য পরিবর্তন করেছি, তা >>উল্লেখ করার জন্য! এছাড়াও, আমি su SomeUserssh মাধ্যমে সংযোগ করার পরে একটি পদক্ষেপ মিস করেছি missed
অ্যাকোরিয়াস পাওয়ার

এই bash -c 'echo hi >&2; echo bye >&2' 2>/tmp/foo;cat /tmp/fooনা! (এমনকি সহ 2>&1 |tee /tmp/foo) লগিংয়ের জন্য যা নিখুঁত এবং আমি সমস্ত কিছু পরিবর্তন করার পরে এটি পুরোপুরি কাজ করবে >&2। তাই আমি শুধুমাত্র একটি সরাসরি ফাইল ব্যবহার অনুমান /dev/stderrছিন্ন মঞ্জুরি দেয় যা না সদৃশ বর্ণনাকারী, শীতল ধন্যবা!
কুম্ভ শক্তি

@ অ্যাকুরিয়াস পাওয়ারটি সঠিক, সদৃশ ফাইল ডেস্ক্রিপ্টর কখনই সংক্ষিপ্ত হয় না। এটি প্রথম অনুচ্ছেদে রয়েছে, আমার কোনওভাবে এটি হাইলাইট করা দরকার?
ডার্বোবার্ট

প্রয়োজন নেই, আমি মাঝে মাঝে ধীর হয়ে যাই
কুম্ভ শক্তি

3
এই উত্তরটি উন্নত করা যেতে পারে। > & এটি একটি টোকেন দুটি নয় এবং সেখানে রয়েছে ওপি'র বিভ্রান্তি।
জোশুয়া

8

ব্যর্থতা ক্ষেত্রে ঘটতে কারণ ব্যাশ সিনট্যাক্স ব্যবহার করার জন্য &পুনঃনির্দেশগুলি একটি একক নির্দিষ্ট করে >এবং প্রয়োজন যে এটা সরাসরি সংলগ্ন বিদ্যমান &সাইন ইন:

[এন]> & শব্দ


2

'>'পুনঃনির্দেশ করতে ব্যবহার করুন (উপস্থিত থাকলে সংক্ষিপ্ততর) বা '>>'(উপস্থিত থাকলে সংযোজন)

'>&'একটি স্ট্রিমটির সদৃশ করতে ব্যবহার করুন , উদাহরণস্বরূপ, আপনি যদি একই ফাইলে স্ট্যান্ডার্ড আউটপুট এবং স্ট্যান্ডার্ড ত্রুটি চান তবে আপনি ফাইলটিতে পুনঃনির্দেশ করুন '> output.log'এবং এর সাথে ত্রুটিও'2>&'

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