পুনর্নির্দেশ ব্যর্থ হলে বাশ প্রোগ্রামটি কার্যকর করা হয় না


9

ব্যাশে, আমি লক্ষ্য করেছি যে পুনঃনির্দেশ ব্যবহার করে যদি কোনও কমান্ড ব্যর্থ হয় তবে এর আগে চলমান কোনও প্রোগ্রাম চালানো হয় না।

উদাহরণস্বরূপ, এই প্রোগ্রামটি "a" ফাইলটি খুলবে এবং "এ" ফাইল করার জন্য 50 বাইট লিখবে। তবে, এই কমান্ডটি অপর্যাপ্ত অনুমতি () রুট / লগ) সহ কোনও ফাইলে পুনঃনির্দেশ সহ চালানো "আ" ফাইলের আকারে কোনও পরিবর্তন আনবে না।

$ ./write_file.py >> ~root/log
-bash: /var/root/log: Permission denied
cdal at Mac in ~/experimental/unix_write
$ ls -lt
total 16
-rw-rw-r--  1 cdal  staff  0 Apr 27 08:54 a <-- SHOULD BE 50 BYTES

কেউ মনে করতে পারে যে প্রোগ্রামটি চলবে, যে কোনও আউটপুট ক্যাপচার করবে (তবে "a" ফাইলটি লিখবে) এবং তারপরে কোনও আউটপুট ~ রুট / লগতে লিখতে ব্যর্থ হবে। পরিবর্তে প্রোগ্রামটি কখনও চালিত হয় না।

এটি কেন, এবং কোনও প্রোগ্রাম কার্যকর করার আগে বাশ কীভাবে "চেক" এর ক্রমটি সম্পাদন করে তা চয়ন করে? অন্যান্য চেকগুলিও কি সম্পাদিত হয়?

পিএস আমি নির্ধারণ করার চেষ্টা করছি যে ক্রোন অধীনে কোনও প্রোগ্রাম চলমান আসলে "অনুমতি অস্বীকৃত" ফাইলটিতে পুনর্নির্দেশের সময় চালিত হয়েছিল কিনা।


আপনার প্রোগ্রামটি জরিমানা কার্যকর করে সবকিছুই কার্যকর কার্যক্রমে (অর্থাত্ আপনার .PY ফাইলটির মালিকানা এবং অনুমতি)। আপনার সমস্যাগুলি পুনঃনির্দেশ থেকে আসে। আপনার ফাইলিন / রুট ডিরেক্টরি লেখার অনুমতি নেই। এবং আপনি stdoutঠিক তা করতে আপনাকে পুনর্নির্দেশ করেছেন । সুতরাং, আপনার প্রোগ্রামটি চললেও আপনি কোনও আউটপুট দেখতে পাবেন না।
মেলবারস্লান

2
মেল, এটি সত্য নয়, প্রোগ্রামটি আসলে কখনও চলেনি। নীচে উত্তর দেখুন।
চার্লি ডালাসাস

আপনি: " write_file.pyপ্রোগ্রামটি চালান এবং এর আউটপুট ~root/logব্যাশে প্রেরণ করুন :" দুঃখিত, তবে আপনাকে সেই ফাইলটিতে লেখার অনুমতি নেই! "শেলটি ঠিক যা করা উচিত তা করছে it যদি আপনি এটি যা বলেছিলেন তা যদি এটি না করতে পারে তবে করুন, এটি তাত্ক্ষণিকভাবে আপনাকে কেন তা সমস্যা সমাধানের সিদ্ধান্ত নেওয়ার সুযোগ দেয় এবং এটি কীভাবে মোকাবেলা করতে হবে তা আপনাকে অবহিত করে। এটি সংরক্ষণের জন্য আপনি যদি জায়গা নির্ধারণের জন্য যথেষ্ট পরিমাণে গুরুত্বপূর্ণ হন তবে এটিএসএস | ইউ | আমার পক্ষে ভুল হবে স্টাডাউট সংরক্ষণ না করে চালানো ঠিক ছিল
মন্টি হার্ডার

উত্তর:


18

এটি চেক অর্ডার করার পক্ষে আসলেই প্রশ্ন নয়, কেবল শেলটি যে জিনিসটি সেট আপ করে। কমান্ড চালানোর আগে পুনর্নির্দেশগুলি সেট আপ করা হয়; সুতরাং আপনার উদাহরণে, শেলটি ~root/logজড়িত কোনও কিছু করার চেষ্টা করার আগে সংযোজনের জন্য খোলার চেষ্টা করে ./write_file.py। যেহেতু লগ ফাইলটি খোলা যায় না, পুনর্নির্দেশটি ব্যর্থ হয় এবং শেলটি সেই সময়ে কমান্ড লাইনের প্রক্রিয়া বন্ধ করে দেয়।

এটি প্রদর্শনের একটি উপায় হ'ল একটি এক্সিকিউটেবল ফাইল নেওয়া এবং এটি চালানোর চেষ্টা করা:

$ touch demo
$ ./demo
zsh: permission denied: ./demo
$ ./demo > ~root/log
zsh: permission denied: /root/log

এটি দেখায় যে শেলটি ./demoকখন পুনর্নির্দেশটি সেট আপ করা যায় না সেদিকেও নজর দেয় না ।


বাহ, এটা সহজ? আমি বুঝতে পারিনি যে পুনঃনির্দেশগুলি আগে করা হয়েছিল। এই উত্তরের জন্য এবং অন্যান্য দুর্দান্ত উত্তরের জন্যও ধন্যবাদ।
চার্লি ডালাসাস

6
যদি সেগুলি প্রথমে না করা হয় তবে আউটপুট কোথায় লেখা হবে?
চার্লস ডাফি

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

11

বাশ ম্যান পৃষ্ঠা থেকে বিভাগটি পুনর্নির্মাণ (আমার জোর দিয়ে):

কমান্ড কার্যকর হওয়ার আগে , শেল দ্বারা ব্যাখ্যা করা একটি বিশেষ স্বরলিপি ব্যবহার করে এর ইনপুট এবং আউটপুট পুনর্নির্দেশ করা যেতে পারে।

...

একটি ফাইল খোলার বা তৈরি করতে ব্যর্থ হওয়ায় পুনর্নির্দেশটি ব্যর্থ হয়।

সুতরাং শেলটি লক্ষ্য ফাইলটি খোলার চেষ্টা করে stdoutযা ব্যর্থ হয় এবং কমান্ডটি মোটেও কার্যকর হয় না।


অনেক ধন্যবাদ. আমি আশা করি ম্যান পেজটি "... দিয়ে যদি আউটপুটটি পুনঃনির্দেশিত করা না যায় তবে প্রোগ্রামটি কার্যকর করা হবে না" দিয়ে কিছুটা স্পষ্ট করে দেওয়া হয়েছে।
চার্লি ডালাসাস

আপডেট করা হয়েছে; এটি বরং নীচে কিছু অনুচ্ছেদ লুকিয়েছে।
মার্ফি

আসলে, এটা বেশ পরিষ্কার। "একটি ফাইল খুলতে বা তৈরি করতে ব্যর্থ হওয়ায় পুনঃনির্দেশ ব্যর্থ হয়।" এটা আছে। আবার ধন্যবাদ.
চার্লি ডালাসাস

3

এটি পর্যবেক্ষণ করার মতো যে প্রোগ্রামটি শুরুর আগে শেল অবশ্যই পুনর্নির্দেশগুলি স্থাপন করবে।

আপনার উদাহরণ বিবেচনা করুন:

./write_file.py >> ~root/log

শেলের মধ্যে যা ঘটে তা হ'ল:

  1. আমরা (খোল) fork(); শিশু প্রক্রিয়া তার পিতামাতার (শেল) থেকে খোলা ফাইল বর্ণনাকারীদের উত্তরাধিকার সূত্রে পায়।
  2. শিশু প্রক্রিয়াতে, আমরা fopen()(the মূল / লগের সম্প্রসারণ), এবং dup2()এটি এফডি 1 (এবং close()অস্থায়ী এফডি) করতে পারি। যদি fopen()ব্যর্থ exit()হয় তবে পিতামাতাকে ত্রুটিটি জানাতে কল করুন ।
  3. এখনও সন্তানের মধ্যে আমরা exec()"./writ_file.py"। এই প্রক্রিয়াটি এখন আমাদের কোনও কোড চালিয়ে যাচ্ছে না (যদি না আমরা কার্যকর করতে ব্যর্থ হই, তবে exit()এক্ষেত্রে আমরা পিতামাতার কাছে ত্রুটিটি রিপোর্ট করব)।
  4. পিতা-মাতা wait()সন্তানের জন্য তার প্রস্থান কোডটি হ'ল শেষ করতে এবং পরিচালনা করতে হবে ( $?অন্তত এটিকে অনুলিপি করে )।

সুতরাং শিশুটির মধ্যে পুনঃনির্দেশটি ঘটতে হবে fork()এবং exec(): এর আগে fork()এটি ঘটতে পারে না কারণ এটি অবশ্যই শেলের স্টডআউট পরিবর্তন করতে পারে না এবং এটি পরে ঘটতে পারে না exec()কারণ ফাইলনাম এবং শেলের এক্সিকিউটেবল কোডটি এখন পাইথন প্রোগ্রাম দ্বারা প্রতিস্থাপন করা হয়েছে । সন্তানের ফাইল বর্ণনাকারীর জন্য পিতামাতার কোনও অ্যাক্সেস নেই (এবং এটি হয়ে থাকলেও এটি exec()স্টাডআউটে প্রথম লেখার মধ্যে পুনর্নির্দেশের গ্যারান্টি দিতে পারে না )।


0

আমি আপনাকে জানাতে দুঃখিত যে এটি সম্পূর্ণ বিপরীত। শেলটি প্রথমে এটি I / O খুলতে হবে এবং তারপরে প্রোগ্রামটির নিয়ন্ত্রণ নিয়ন্ত্রণ করে।

tee এই ক্ষেত্রে সহায়ক হতে পারে: ./write_file.py | tee -a ~root/log > /dev/null


টি ব্যর্থ হওয়ার পরে পাইথন লিপিটি কি কেবল সিপাইপিতে মারা যাবে না?
কেভিন

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