আমি মনে করি না এটি পুরোপুরি বাশার সমস্যা।
একটি মন্তব্যে, আপনি বলেছিলেন যে আপনি করার পরে এই ত্রুটিটি দেখেছেন
sudo su username2
হিসাবে লগ ইন যখন username। এটা suযে সমস্যা triggering হচ্ছে।
/dev/stdoutকরার জন্য একটি সিমবলিক লিঙ্ক হয় /proc/self/fd/1, যা করার জন্য একটি সিমবলিক লিঙ্ক, উদাহরণস্বরূপ হয়, /dev/pts/1। /dev/pts/1, যা সিউডোটার্মিনাল, এর মালিকানাধীন, এবং এর দ্বারা লিখিত username; usernameলগ ইন করার সময় সেই মালিকানা মঞ্জুর করা হয়েছিল When আপনি যখন sudo su username2, এর মালিকানা /dev/pts/1পরিবর্তন হয় না, এবং username2লেখার অনুমতি নেই।
আমি তর্ক করব যে এটি একটি বাগ is প্রকৃতপক্ষে স্ট্যান্ডার্ড আউটপুট প্রবাহের জন্য একটি উপনাম /dev/stdout হওয়া উচিত তবে এখানে আমরা এমন একটি পরিস্থিতি দেখি যেখানে echo helloকাজ করে তবে echo hello > /dev/stdoutব্যর্থ হয়।
একটি কর্মসূচী username2গ্রুপের সদস্য করা হবে tty, তবে এটি যে কোনও টিটি-র username2কাছে লেখার অনুমতি দেবে , যা সম্ভবত অনাকাঙ্ক্ষিত।
আর একটি কাজ হ'ল username2ব্যবহার না করে অ্যাকাউন্টে লগইন করা su, যাতে /dev/stdoutমালিকানাধীন নতুন বরাদ্দকৃত সিউডোটার্মিনালটিকে নির্দেশ করে username2। এটি ব্যবহারিক হতে পারে না।
আর একটি কাজ হ'ল আপনার স্ক্রিপ্টগুলি সংশোধন করা যাতে তারা উল্লেখ করে না /dev/stdoutএবং /dev/stderr; উদাহরণস্বরূপ, এটি প্রতিস্থাপন করুন:
echo OUT > /dev/stdout
echo ERR > /dev/stderr
এটা দ্বারা:
echo OUT
echo ERR 1>&2
আমি আমার নিজের সিস্টেম, উবুন্টু 12.04 তে এটিকে দেখতে ব্যাশ 4.2.24 সঙ্গে, - যদিও ব্যাশ দস্তাবেজ ( info bash) আমার সিস্টেমে বলে /dev/stdoutএবং /dev/stderrযখন পুনঃনির্দেশগুলি ব্যবহৃত বিশেষভাবে চিকিত্সা করা হয়। তবে যদিও বাশ সেই নামগুলি বিশেষভাবে ব্যবহার করে না, তবুও তাদের স্ট্যান্ডার্ড I / O স্ট্রিমগুলির সমপরিমাণ হিসাবে কাজ করা উচিত। (পসিক্স উল্লেখ করেনি /dev/std{in,out,err}, সুতরাং এটি ত্রুটিযুক্ত যে তর্ক করা কঠিন হতে পারে))
বাশের পুরানো সংস্করণগুলির দিকে তাকানো, ডকুমেন্টেশনের মাধ্যমে বোঝা যায় যে /dev/stdoutফাইলগুলির অস্তিত্ব আছে বা না থাকায় এট আলকে বিশেষভাবে চিকিত্সা করা হয়। বৈশিষ্ট্যটি ব্যাশ ২.০৪ এ প্রবর্তিত হয়েছিল এবং NEWSসংস্করণটির ফাইলটি বলে:
পুনঃনির্দেশ কোডটি এখন বেশ কয়েকটি ফাইলের নাম বিশেষত: / dev / fd / N, / dev / stdin, / dev / stdout, এবং / dev / stderr পরিচালনা করে, তারা ফাইল সিস্টেমে উপস্থিত রয়েছে কি না।
তবে আপনি যদি সোর্স কোডটি পরীক্ষা করেন ( redir.c), আপনি দেখতে পাবেন যে সেই বিশেষ হ্যান্ডলিংটি কেবলমাত্র প্রতীকটি HAVE_DEV_STDINসংজ্ঞায়িত হলেই সক্ষম হয় (বাশ উত্স থেকে তৈরি হওয়ার সময় এটি নির্ধারিত হয়)।
আমি যতদূর বলতে পারি, বাশের কোনও প্রকাশিত সংস্করণ /dev/stdoutএট- অ- শর্তহীন শর্তাবলীর বিশেষ পরিচালন করতে পারে নি - যদি না কিছু বিতরণ প্যাচ করে।
সুতরাং আর একটি কার্যনির্বাহী (যা আমি চেষ্টা করিনি) হ'ল বাশ উত্সগুলি দখল করা , redir.cবিশেষ /dev/*হ্যান্ডলিংকে নিঃশর্ত করার জন্য পরিবর্তন করা এবং আপনার সিস্টেমে আসা সংস্করণটির পরিবর্তে আপনার পুনর্নির্মাণ সংস্করণটি ব্যবহার করা। যদিও এটি সম্ভবত ওভারকিল।
সারসংক্ষেপ :
আপনার OS আমার মত, মালিকানা ও অনুমতি হ্যান্ডলিং করা হয় না /dev/stdoutএবং /dev/stderrসঠিকভাবে। বাশ সম্ভবত এই নামগুলি পুনর্নির্দেশগুলিতে বিশেষভাবে বিবেচনা করে তবে বাস্তবে এটি ফাইলগুলির অস্তিত্ব না থাকলে তা করে। যে বিষয়টি না যদি /dev/stdoutএবং /dev/stderrসঠিকভাবে কাজ করেন। আপনি যখন suঅন্য অ্যাকাউন্টে যান বা অনুরূপ কিছু করেন কেবল তখনই এই সমস্যাটি দেখা যায় ; আপনি যদি কেবল কোনও অ্যাকাউন্টে লগইন করেন তবে অনুমতিগুলি সঠিক।
ls -l /dev/stdout /dev/stderrএবংls -lL /dev/stdout /dev/stderr?