আমি মনে করি না এটি পুরোপুরি বাশার সমস্যা।
একটি মন্তব্যে, আপনি বলেছিলেন যে আপনি করার পরে এই ত্রুটিটি দেখেছেন
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
?