আপনি কেন লুপগুলির জন্য ইনপুট পুনর্নির্দেশ অপারেটরের ক্রমটিকে বিপরীত করতে পারবেন না?


11

বাশ-এ আপনি ইনপুট পুনর্নির্দেশ অপারেটরগুলিকে একটি কমান্ডের সামনে নিয়ে যেতে পারেন:

cat <<< "hello"
# equivalent to
<<< "hello" cat

লুপের জন্য কেন আপনি একই কাজ করতে অক্ষম?

while read -r line; do echo "$line"; done <<< "hello"
# hello

<<< "hello" while read -r line; do echo "$line"; done
# -bash: syntax error near unexpected token `do'

আপনি কিছুটা লুপের মধ্যে পাইপ করতে পারেন বলে আমি এটি কিছুটা বিভ্রান্তি বোধ করি । আমি কি কিছু ভুল করছি বা এটি কেবল একটি ডিজাইনের সিদ্ধান্ত ছিল?

উত্তর:


16

ব্যাকরণ কীভাবে সংজ্ঞায়িত করা হয়েছে তার এটি কেবল একটি পরিণতি। থেকে POSIX শেল ব্যাকরণ স্পেসিফিকেশন :

command          : simple_command
                 | compound_command
                 | compound_command redirect_list
                 | function_definition
                 ;

এবং:

simple_command   : cmd_prefix cmd_word cmd_suffix
                 | cmd_prefix cmd_word
                 | cmd_prefix
                 | cmd_name cmd_suffix
                 | cmd_name
                 ;
[...]
cmd_prefix       :            io_redirect
                 | cmd_prefix io_redirect
                 |            ASSIGNMENT_WORD
                 | cmd_prefix ASSIGNMENT_WORD
                 ;
cmd_suffix       :            io_redirect
                 | cmd_suffix io_redirect
                 |            WORD
                 | cmd_suffix WORD
                 ;

আপনি দেখতে পাচ্ছেন, যৌগিক কমান্ড সহ, পুনঃনির্দেশের অনুমতি কেবল পরে দেওয়া হয় , তবে সাধারণ কমান্ডের সাহায্যে এটি এর আগেও অনুমোদিত হয়। সুতরাং যখন শেল উদ্ধার <redirection> foo, fooএকটি সহজ কমান্ড, না একটি যৌগ কমান্ড হিসাবে গণ্য করা হয়, এবং whileআর একটি শব্দ হিসাবে গণ্য হয়:

$ < foo while
bash: while: command not found

সুতরাং, এটি doঅপ্রত্যাশিত, কারণ এটি কেবলমাত্র নির্দিষ্ট কীওয়ার্ডের পরে অনুমোদিত allowed

সুতরাং এটি কেবল whileলুপগুলিতেই लागू হয় না, তবে সংরক্ষিত শব্দ ব্যবহার করে যৌগিক কমান্ড স্থাপনের বেশিরভাগ উপায়:

$ < foo {
bash: {: command not found
$ < foo if
bash: if: command not found
$ < foo for
bash: for: command not found

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