প্রতিধ্বনিকে কেন / bin / sh -c ইকো ফু আউটপুট বলে কিছু বলা হয় না?


15

উদাহরণস্বরূপ, এটি কাজ করার সময়:

$ প্রতিধ্বনি
foo বিন্যাস

এটি করে না:

$ / বিন / শ-সি প্রতিধ্বনি ফু

যদিও এটি করে:

$ / বিন / শ-সি 'প্রতিধ্বনি; প্রতিধ্বনি বার '
foo বিন্যাস
বার

কোন ব্যাখ্যা আছে?

উত্তর:


21

থেকে man sh

-c string   If the -c option is present, then commands are read from string. 
            If there are arguments after the string, they are assigned to the
            positional parameters, starting with $0

এর অর্থ আপনার আদেশটি এর মতো হওয়া উচিত:

 $ sh -c 'echo "$0"' foo 
 foo

একইভাবে:

$ sh -c 'echo "$0 $1"' foo bar
foo bar

এটিই প্রথম অংশটি ছিল; আমার ধারণা, দ্বিতীয় কেসটি সহজ এবং ব্যাখ্যাটির দরকার নেই।


2
একটি কঠোর, মানসম্পন্ন উপায় হবেsh -c 'echo $1' echo foo
jliagre

1
sh -c 'echo "$@"' fnord a b c d ...
zwol

3
আইএমএইচও ব্যাখ্যাটি বেশ ভাল ছিল, তবে sh -c 'echo $0' fooএটি সর্বোত্তম বিকল্প নয়, এটি বিবেচনায় রেখে প্রশ্নকর্তা ইতিমধ্যে জানেন যে এটি /bin/sh -c 'echo foo; echo bar'কাজ করে, আপনি কেবলমাত্র আদেশটি উদ্ধৃত করে উত্তর দিতে পারেন/bin/sh -c 'echo foo'
এক্স

1
@ এক্স 3 এমবয় প্রশ্নকর্তা ইতিমধ্যে জানেন যে / বিন / এস-সি 'ইকো ফু' ভাল কাজ করে। তিনি এর বাইরে কিছু প্রতিধ্বনি করতে চেয়েছিলেন, যা আমি ব্যাখ্যা করেছি
ইজাজ আহমেদ খান

18
$ echo foo
foo

এই echoআর্গুমেন্ট ফু এবং ফু দিয়ে মুদ্রিত হয় with

$ /bin/sh -c echo foo

এই আর্গুমেন্টের সঙ্গে শেল ডাকে echoএবং উপলব্ধ foo বিন্যাস আর্গুমেন্ট হিসাবে $0echoনতুন লাইন আউটপুট এবং আপনি বাতিল foo বিন্যাস । আপনি যদি foo আউটপুট করতে চান তবে যুক্তিটি উদ্ধৃত করুন:

sh -c 'echo foo'

বা প্রদত্ত যুক্তিটি ব্যবহার করুন:

sh -c 'echo $0' foo

এই উদাহরণে

$ /bin/sh -c 'echo foo; echo bar'
foo
bar

echo foo; echo barআউটপুট আর্গুমেন্টের সাহায্যে শেলটি ডাকা হয়

foo
bar

8

এই আদেশে:

echo foo

echoবাইনারি (বা অন্তর্নির্মিত কমান্ড) এবং fooএটি প্রথম যুক্তি।

এখানে:

/bin/sh -c echo foo

/bin/shবাইনারি, যার প্রথম যুক্তিটি হ'ল -c, যা নিজেই একটি "কমান্ড স্ট্রিং" প্যারামিটার হিসাবে গ্রহণ করে। এটি echoউপরের উদাহরণে রয়েছে। তারপরে তৃতীয় যুক্তি রয়েছে: fooএটি একটি যুক্তি /bin/sh, পক্ষে নয় echo। এজন্য আপনার তৃতীয় উদাহরণে:

/bin/sh -c 'echo foo; echo bar'

... দুটোই মুদ্রিত আপনি যুক্তিটি উদ্ধৃত করেছেন। সুতরাং: প্রথম যুক্তিটি হ'ল -c, এবং এই যুক্তির পরামিতিটি 'echo foo; echo bar'যা সম্পূর্ণরূপে একটি তর্ক হিসাবে ব্যাখ্যা করা হয়; "কমান্ড স্ট্রিং" হিসাবে।


3

কাঠামোটি কেবল sh -c wordএকটি শব্দ চালায় (শেলের মধ্যে)।
যুক্ত হওয়া শব্দের অর্থ অন্যান্য জিনিস, যেমন আর্গুমেন্ট শূন্য, এক, দুটি, ইত্যাদি .:

sh -c word zero one two three

একটি শব্দের মতো ফাঁকা স্থান রয়েছে এমন কমান্ড রাখতে উদ্ধৃতি দেওয়া দরকার:

sh -c 'echo fnord' zero one two three

সুতরাং, এটি সমস্ত যুক্তি মুদ্রণ করে:

$ sh -c 'echo "args=" "$0" "$@"' zero one two three
args = zero one two three

উদাহরণ

আপনি যে উদাহরণটি উপস্থাপন করছেন: /bin/sh -c echo fooপ্রথম শব্দটি (বিকল্পগুলির পরে) হ'ল echoএটিই কার্যকর হয়। এবং কোনও পাঠ্যবিহীন প্রতিধ্বনি কেবল একটি নতুন লাইন মুদ্রণ করবে, অন্য কিছুই নয়:

$ / বিন / শ-সি প্রতিধ্বনি ফু

এজন্য আপনি খালি লাইন পান।

আপনি যদি স্থানটি উদ্ধৃত করেন, আপনি "এক শব্দ" (ফাঁকা স্থান নেই) চালাবেন:

$ / বিন / শ-সি প্রতিধ্বনি \ ফু
foo বিন্যাস
$ / বিন / এস-সি "ইকো ফু"
foo বিন্যাস
bin / বিন / এস-সি 'ইকো ফু'
foo বিন্যাস

উপসংহার

উদ্ধৃতি ব্যবহার করে নির্বাহিত কমান্ডটিকে "শব্দ" হিসাবে রাখুন।

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