অ্যাসাইনমেন্টগুলি প্রস্থান স্থিতি সহ কমান্ডের মতো হ'ল কমান্ড প্রতিস্থাপনের বিকল্পটি ছাড়া কি?


10

নীচের উদাহরণগুলি এবং পসিক্স শেলগুলিতে তাদের ফলাফলগুলি দেখুন:

  1. false;echo $?বা false || echo 1:1
  2. false;foo="bar";echo $?বা foo="bar" && echo 0:0
  3. foo=$(false);echo $?বা foo=$(false) || echo 1:1
  4. foo=$(true);echo $?বা foo=$(true) && echo 0:0

Https://stackoverflow.com/questions/6834487/ কি-is-the-variable-in- Shell-scriptting- এ সর্বাধিক ভোট দেওয়া উত্তর দ্বারা উল্লিখিত হয়েছে :

$? শেষ সম্পাদিত কমান্ডের রিটার্ন মান সন্ধান করতে ব্যবহৃত হয়।

এটি সম্ভবত এই ক্ষেত্রে কিছুটা বিভ্রান্তিকর, সুতরাং আসুন পসিক্স সংজ্ঞাটি পাই যা সেই থ্রেডের একটি পোস্টে উদ্ধৃতও করা হয়েছে:

? সর্বাধিক সাম্প্রতিক পাইপলাইন দশমিক প্রস্থান স্থিতি প্রসারিত (পাইপলাইন দেখুন)।

সুতরাং এটি প্রদর্শিত হবে যেন একটি অ্যাসাইনমেন্ট নিজেই একটি শূন্য প্রস্থান মান সহ একটি কমান্ড (বা বরং একটি পাইপলাইন অংশ) হিসাবে গণনা করে তবে এটি অ্যাসাইনমেন্টের ডান দিকের আগে প্রযোজ্য (যেমন কমান্ড প্রতিস্থাপনটি এখানে আমার উদাহরণগুলিতে কল করে)।

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

ASSIGNMENT( VARIABLE, VALUE )

তাহলে foo="bar"হবে

ASSIGNMENT( "foo", "bar" )

এবং foo=$(false)কিছু হবে

ASSIGNMENT( "foo", EXECUTE( "false" ) )

যা অর্থ দাঁড়ায় এই যে EXECUTEরান প্রথম এবং শুধুমাত্র পরে ASSIGNMENT চালানো হয় কিন্তু এটি এখনও এর EXECUTEঅবস্থা যে এখানে গুরুত্বপূর্ণ।

আমি কি আমার মূল্যায়নে সংশোধন করছি বা আমি কিছু ভুল বুঝে / মিস করছি? আমার জন্য এই আচরণকে "অদ্ভুত" হিসাবে দেখার সঠিক কারণগুলি কি?


1
দুঃখিত, তবে আপনি কি অদ্ভুত মনে করেন তা আমার কাছে অস্পষ্ট।
কুসালানন্দ

1
@ কুসালানন্দ সম্ভবত এটি আপনাকে বলতে সাহায্য করেছিল যে এটি আমার নিজেকে জিজ্ঞাসা করে শুরু হয়েছিল: " false;foo="bar";echo $?শেষ আসল কমান্ডটি যখন দৌড়েছিল তখন সর্বদা কেন 0 ফিরে আসে না false?" কোডগুলি প্রস্থান করার ক্ষেত্রে এটি অ্যাসাইনমেন্টগুলি বিশেষ আচরণ করে। তাদের প্রস্থান কোডটি সর্বদা 0 থাকে তবে যখনই এটি এমন কোনও কিছু নয় যা অ্যাসাইনমেন্টের ডান হাতের অংশ হিসাবে চলেছিল।
পিএইচকে

1
সংশ্লিষ্ট: stackoverflow.com/questions/20157938/...
Kusalananda

উত্তর:


10

অ্যাসাইনমেন্টের জন্য প্রস্থান স্থিতি অদ্ভুত । কোনও অ্যাসাইনমেন্ট ব্যর্থ হওয়ার সর্বাধিক সুস্পষ্ট উপায় হ'ল যদি লক্ষ্য ভেরিয়েবল চিহ্নিত হয় readonly

$ err(){ echo error ; return ${1:-1} ; }
$ PS1='$? $ '
0 $ err 42
error
42 $ A=$(err 12)
12 $ if A=$(err 9) ; then echo wrong ; else E=$? ; echo "E=$E ?=$?" ; fi
E=9 ?=0
0 $ readonly A
0 $ if A=$(err 10) ; then echo wrong ; else E=$? ; echo "E=$E ?=$?" ; fi
A: is read only
1 $

নোট করুন যে যদি বিবৃতি নেওয়া না হয়ে থাকে তবে সত্যিকারের বা মিথ্যা পথগুলিই অ্যাসাইনমেন্ট ব্যর্থ হয়ে পুরো বিবৃতিটির কার্য সম্পাদন বন্ধ করে দিয়েছে। POSIX মোডে ব্যাশ এবং ksh93 এবং zsh একটি অ্যাসাইনমেন্ট ব্যর্থ হলে সমস্ত স্ক্রিপ্ট বাতিল করে দেবে।

এটিতে পসিক্স মানটি উদ্ধৃত করতে :

কমান্ড নাম ব্যতীত একটি কমান্ড, কিন্তু একটিতে কমান্ড প্রতিস্থাপন অন্তর্ভুক্ত রয়েছে, শেলটি সম্পাদিত সর্বশেষ কমান্ড প্রতিস্থাপনের একটি প্রস্থান স্থিতি রয়েছে।

এটি শেল ব্যাকরণের সাথে জড়িত হ'ল অংশ

 foo=$(err 42)

যা একটি simple_command(সরল_কম্যান্ড → সেমিডি_প্রিফিক্স → ASSIGNMENT_WORD) থেকে আসে । সুতরাং যদি কোনও অ্যাসাইনমেন্ট সফল হয় তবে কমান্ড সাবস্টিটিউশন জড়িত না হলে প্রস্থান স্থিতি শূন্য হয়, সেক্ষেত্রে প্রস্থান স্থিতিটি সর্বশেষের স্থিতি। যদি অ্যাসাইনমেন্ট ব্যর্থ হয় তবে প্রস্থান স্থিতি শূন্য নয়, তবে আপনি এটি ধরতে পারবেন না।


1
আপনার উত্তরে যোগ করতে, এখানে আলাদা থ্রেডের একটি উত্তর যেখানে এর উপরে একটি নতুন পসিক্স মান উদ্ধৃত করা হয়েছে, উপসংহারটি মূলত একই: unix.stackexchange.com/a/270831/117599
phk

4

তুমি বলো,

... এটি প্রদর্শিত হবে যেন একটি অ্যাসাইনমেন্ট নিজেই একটি কমান্ড হিসাবে গণনা করে ... একটি শূন্য প্রস্থান মূল্য সহ, তবে যা অ্যাসাইনমেন্টের ডান পাশের আগে প্রযোজ্য (যেমন, একটি কমান্ড প্রতিস্থাপন কল ...)

এটি দেখার মতো ভয়ঙ্কর উপায় নয়। তবে এটি সামান্য ওভারসিম্প্লিফিকেশন। থেকে সামগ্রিক ফেরতের স্থিতি

এ = $ ( সেন্টিমিটার 1 ) বি = $ ( সেমিডি 2 ) সি = $ ( সেমিডি 3 ) ডি = $ ( সেন্টিমিটার 4 ) ই = এমসি 2
থেকে প্রস্থান স্থিতি । নিয়োগ পর যেটা নিয়োগ 0 সামগ্রিক প্রস্থান অবস্থা সেট করেনি।cmd4E=D=

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

$ err() { echo "stdout $*"; echo "stderr $*" >&2; return ${1:-1}; }
$ readonly A
$ Z=$(err 41 zebra) A=$(err 42 antelope) B=$(err 43 badger)
stderr 41 zebra
stderr 42 antelope
bash: A: readonly variable
$ echo $?
1
$ printf "%s = %s\n" Z "$Z" A "$A" B "$B"
Z = stdout 41 zebra
A =
B =
$

যদিও Aশুধু পড়ার জন্য, ব্যাশ executes ডানদিকে কমান্ড প্রতিকল্পন A=- এবং তারপর কমান্ড aborts কারণ Aশুধু পড়ার জন্য। এটি আপনার ব্যাখ্যার সাথে আরও বিরোধী যে অ্যাসাইনমেন্টের প্রস্থান মূল্য নির্ধারণের ডান দিকের আগে প্রযোজ্য।

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