কোনও su -m - USER -c "<Cmd>" এর বাইরে একটি প্রস্থান কোড অ্যাক্সেস করা হচ্ছে


8

নীচের কমান্ডটি ব্যর্থতার উপর নির্ভর করে "0" বা "1" সঠিকভাবে মুদ্রণ করে কারণ আমি put রেখেছি? "su" কমান্ডের ভিতরে।

sudo su -m $USER -c "./shutdown.sh &> /dev/null; echo \$?"

তবে, আমি যদি এটি করি:

sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null"; echo $?

এটি সর্বদা "0" মুদ্রণ করবে কারণ কমান্ড অংশ ব্যর্থ হওয়া সত্ত্বেও প্রকৃত "সু" সর্বদা সফল হবে।

কোনও ধারণা কীভাবে আমি সাবসেলের প্রস্থান কোডটি পুনরুদ্ধার করতে পারি?

উত্তর:


7

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

আপনি যেমন উল্লেখ করেছেন মূল সমস্যাটি হ'ল su সফলভাবে এটির আদেশটি কার্যকর করে। ডিফল্ট ক্রিয়াটি তখন জানানো হয় যে এটি কোনও সমস্যা ছাড়াই সম্পন্ন হয়েছে এবং তাই এটি প্রস্থান কোড 0 ফিরে আসে It এটি "জানে না" যে কোনও কমান্ড থেকে একটি অ 0 প্রস্থান কোড অপ্রত্যাশিত ছিল, বা এটি এর সাথে কিছু করা উচিত। সুতরাং সমাধানটি বেশ সহজভাবেই এটি শেষ কমান্ডের প্রস্থান কোডটি ফিরিয়ে আনা। এটা আমার জন্য এটি

su <user_x> -c '<bunch_of_commands>; exit $?'

সুডো সুন্দর না খেললে পুরো কমান্ডটি এমন কিছু হওয়া উচিত (আমি এটি আপনার জন্য পরীক্ষা করব তবে আমার সাথে সুডো ইনস্টল নেই)

sudo 'su <user_x> -c \'<bunch_of_commands>; exit $?\'; exit$?'

কোটগুলির বাসা বাঁধার জন্য দেখুন এবং নিশ্চিত হন $? প্রসারিত হয় না, তাই কোন ডাবল উদ্ধৃতি।


2

কমান্ডের অভ্যন্তরে রিটার্ন মানটি প্রতিধ্বনিত করুন এবং একটি ভেরিয়েবলের (পুরোপুরি ব্যবহার করে) পুরো কমান্ডটি নির্ধারিত করে এটির বাইরে অ্যাক্সেস করুন

RETVAL=$(sudo su -m $USER -c "./shutdown.sh &> /dev/null; echo \$?")
echo $RETVAL

0

আপনি সর্বদা একটি tmp ফাইল ব্যবহার করতে পারেন:

$ sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null; echo \$? > /tmp/exit_code"; cat /tmp/exit_code

হ্যাঁ, আমি এখনই এটি করছি, তবে আমি টিএমপি ফাইলের উপর নির্ভর না করার আশা করছিলাম।
নিক

0

এটি Zsh / বাশ / বোর্ন শেলগুলিতে কাজ করে:

$ sudo su -m $USER -c "$BASE/bin/shutdown.sh &> /dev/null"
$ echo $?

আমি নিশ্চিত নই যে আপনি যখন ওয়ান-লাইনারে জিজ্ঞাসা করছেন তখন কেন রিটার্ন কোডটি পাওয়া যায় না, তবে আপনি যখন একই জিনিসটি করার জন্য একাধিক লাইন ব্যবহার করেন তখন এটি উপলব্ধ।


এটি আসলে সঠিক নয়। এটি সর্বদা শূন্য ফিরে আসবে কারণ এর মধ্যে প্রকৃত কমান্ড না থাকলেও "su -m $ USER -c <cmd>" সর্বদা সফল হবে।
নিক

1
@ নিক - এটি এখানে কাজ করে। আপনার আউটপুট কি? sudo su -m zero2cx -c "/bin/false &> /dev/null"আপনার সিস্টেমের ব্যবহারকারীর নাম দিয়ে চেষ্টা করুন । $?'1' হওয়া উচিত।
শূন্য 2cx

হ্যাঁ, আমার নিজস্ব ব্যবহারকারীর সাহায্যে এটি প্রত্যাশিত হিসাবে "1" প্রদান করে। তবে আমি এটির ব্যবহারকারীর মাধ্যমে একটি অ্যাপ চালাতে ব্যবহার করতে চেষ্টা করছি, মূল বা অন্য কোনও ব্যবহারকারীর দ্বারা নয়।
নিক

@ নিক - এটি আপনার ইচ্ছামতো $ USER=appusernameসেট সহ কাজ করা উচিত । সত্যিকারের ব্যবহারকারীর নাম ব্যবহার করবেন না, ইনড্রেড আপনার উদ্দেশ্য ব্যবহার করবে appusername। এটা কাজ করা উচিত, এটা আমার জন্য।
শূন্য 2cx
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.