প্রতিধ্বনি "বার" -ন ইকো-এন "বার" থেকে আলাদা কেন?


10

তুলনা করা

echo -n "bar"

সঙ্গে

echo "bar" -n

প্রাক্তন আমার যা করা উচিত বলে মনে করে তা করে (একটি নতুন লাইন ছাড়াই "বার" মুদ্রণ করে), যদিও পরবর্তীটি তা করে না। এটি কি বাগ বা ডিজাইনের মাধ্যমে? আপনি কেন বিকল্পগুলি সরিয়ে নিতে পারবেন না কেন এটি অনেক ক্লাইম প্রোগ্রামের চেয়ে আলাদা? উদাহরণস্বরূপ, tail -f /var/log/messagesঠিক হিসাবে একই tail /var/log/messages -f। আমি কখনও কখনও পরেগুলি করি যখন আমি ভুলে যাই আমি প্রাক্তনটি চেয়েছিলাম, কারণ অভ্যন্তরীণভাবে বিকল্পগুলি এবং যুক্তিগুলি পুনরায় সাজানো হয়, সাধারণত গোটপট দ্বারা ।

আপডেট: হ্যাঁ আমি আমার প্রশ্নটি মূলত নর্প-এড করেছি। উত্তরগুলির কয়েকটি অর্থবহ করার জন্য আপনাকে ইতিহাসটি দেখতে হবে এমন অপূর্ণটি আমি মুছে ফেলেছি।


3
আমি কি দেখতে থেকে, পার্থক্য হল অবিলম্বে সুস্পষ্ট। echo -n "bar", "বার" দেয় যখন echo "bar" -nদেয় "বার -n"
phunehehe

উত্তর:


18

যেমনটি অন্যরা লক্ষ্য করেছেন, "-n" আক্ষরিক অর্থে ব্যাখ্যা করা হয় যদি কোথাও স্থাপন করা হয় তবে echoকমান্ডের সাথে সাথেই ।

.তিহাসিকভাবে, ইউএনআইএক্স ইউটিলিটিগুলি এ জাতীয় ছিল - তারা কেবল কমান্ডের নামের পরে বিকল্পগুলি সন্ধান করেছিল। সম্ভবত বিএসডি বা জিএনইউ যিনি আরও নমনীয় শৈলীর পথনির্দেশ করেছিলেন (যদিও আমি ভুল হতে পারি), যেমন এখনও পসিএক্স পুরানো পথটিকে সঠিক হিসাবে নির্দিষ্ট করেছে (গাইডলাইন 9 দেখুন এবং man 3 getoptলিনাক্স সিস্টেমেও দেখুন)। যাইহোক, যদিও বর্তমানে বেশিরভাগ লিনাক্স ইউটিলিটিগুলি নতুন স্টাইলটি ব্যবহার করে, তেমন কিছু হোল্ডআউট রয়েছে echo

Echoমানদণ্ড অনুসারে একটি জগাখিচুড়ি, যে সময়ে পসিক্সের সূচনা হওয়ার সময় অন্তত দুটি মৌলিক বিরোধী সংস্করণ ছিল play একদিকে, আপনার কাছে এসওয়াইএসভি-স্টাইল রয়েছে, যা ব্যাকস্ল্যাশ-পলায়নযুক্ত অক্ষরের ব্যাখ্যা দেয় তবে অন্যথায় কোনও বিকল্প গ্রহণ না করে এর যুক্তিগুলিকে আক্ষরিক অর্থে আচরণ করে। অন্যদিকে, আপনার কাছে বিএসডি-স্টাইল রয়েছে, যা প্রাথমিককে -nএকটি বিশেষ কেস হিসাবে বিবেচনা করে এবং অন্য সব কিছুকে আক্ষরিক অর্পণ করে। এবং যেহেতু echoখুব সুবিধাজনক, আপনার কাছে হাজার হাজার শেল স্ক্রিপ্ট রয়েছে যা একটি আচরণ বা অন্যটির উপর নির্ভর করে:

echo Usage: my_awesome_script '[-a]' '[-b]' '[-c]' '[-n]'
echo -a does a thing.
echo -b does something else.
echo -c makes sure -a works right.
echo -- DON\'T USE -n -- it\'s not finished! --

"শব্দের সাথে আক্ষরিক অর্থে আচরণ করুন" অর্থাতৃত্বের কারণে, echoজিনিসগুলি না ভাঙিয়ে এমনকি একটি নতুন বিকল্প যুক্ত করাও অসম্ভব । জিএনইউ যদি এতে নমনীয় বিকল্পগুলি স্কিম ব্যবহার করে তবে নরকটি শিথিল হয়ে যাবে।

ঘটনাচক্রে, বোর্ন শেল বাস্তবায়নগুলির মধ্যে সেরা সামঞ্জস্যের পরিবর্তে ব্যবহার করুনprintfecho

echoবিশেষত কেন নমনীয় বিকল্পগুলি ব্যবহার করে না তা ব্যাখ্যা করার জন্য আপডেট করা ।


upvote যেহেতু আপনি একমাত্র উল্লেখ করতে পারেন এটি প্রত্যাশিত getopt আচরণ।
জিওফ্রে ব্যাচলেট

@ জান্ডার ইকো কেন "হোল্ডআউট"? আমি মনে করি এটি একটি গ্নু কোর্টিল?
xenoterracide

@ এক্সেনো: আমি আমার উত্তর আপডেট করেছি। মূলত, জিএনইউ জিনিসগুলি ভাঙতে চায়নি।
জান্ডার

1
প্রথম অ বিকল্প পর অপশন গ্রহণ নির্দিষ্ট গনুহ ইউটিলিটি এবং প্রোগ্রাম ব্যবহার গনুহ libc এর getopt সুবিধা। ব্যবহারকারীর সর্বদা পরিবেশ পরিবর্তনশীল সেট করে পশ্চাদপটে সামঞ্জস্যপূর্ণ আচরণ পেতে পারে POSIXLY_CORRECT
গিলস 21'29

1
সুনির্দিষ্ট ক্ষেত্রে echo, এমন বাস্তবায়নও রয়েছে যা বিকল্প হিসাবে স্বীকৃতি দেয় -eবা -Eহিসাবে থাকে। বহনযোগ্যতার জন্য, কোনও দিয়ে শুরু করবেন না -বা এর মতো কিছু ব্যবহার করবেন না printf %s -e
গিলস 21'30

9

অন্যান্য উত্তরগুলি এমন বিন্দুতে পৌঁছেছে যে আপনি ম্যান পৃষ্ঠাটিতে দেখতে পারেন যে এটি এন-এর প্রতিধ্বনির স্ট্রিংয়ের অংশ হয়ে উঠছে। তবে আমি কেবল এটি উল্লেখ করতে চাই যে এমডি 5সাম ছাড়াই এটি তদন্ত করা সহজ এবং কিছুটা ক্রিপ্টিক কী হচ্ছে তা তোলে।

[11:07:44][dasonk@Chloe:~]: echo -n "bar"
bar[11:07:48][dasonk@Chloe:~]: echo "bar" -n
bar -n

3
ঠিক +1 যদি কোনও পাইপলাইন আপনার প্রত্যাশা মতো না করে তবে প্রতিটি অংশটি আলাদাভাবে পরীক্ষা করুন।
মাইকেল

6

বাহ, সবার ব্যাখ্যা দীর্ঘ y

এটি সহজ:

-n স্ট্রিংয়ের আগে উপস্থিত হলে এটি একটি বিকল্প, অন্যথায় এটি প্রতিধ্বনিত হওয়া মাত্র অন্য স্ট্রিং।

অপসারণ করুন | md5sum এবং আপনি দেখবেন আউটপুটটি আলাদা।


5

সাধারণ পরিদর্শন থেকে, এটি ডিজাইনের মাধ্যমে কোনও বাগ নয় ...

echo "bar" -n | md5sum

a3f8efa5dd10e90aee0963052e3650a1

নিজের জন্য এই আদেশটি চেষ্টা করুন:

echo "bar -n" | md5sum

আপনি লক্ষ্য করবেন যে ফলাফল এমডি 5 হয়েছে

a3f8efa5dd10e90aee0963052e3650a1

আপনি শুধু ইকো -n এর ব্যবহার মিশ্রিত করেছেন।

আপনার প্রথম নমুনা কোড

echo -n "bar" | md5sum

-n এই প্রতিধ্বনির পরে একটি নতুন লাইন রাখার জন্য না বলার জন্য ব্যবহৃত হয়।

আপনার দ্বিতীয় নমুনা

echo "bar" -n | md5sum

আক্ষরিক পাঠ্য হিসাবে -n আচরণ করছে।

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