কেন "প্রতিধ্বনি" "\\\ সোমোসিওর" one কেবল একটি ব্যাকস্ল্যাশ দেখায়?


19

লিনাক্স শেল থেকে চরিত্র পালনের পর্দার আড়ালে কী ঘটছে তা কেউ কেউ ব্যাখ্যা করতে পারেন? আমি কী চেষ্টা করেছি (এবং কীভাবে) তা বুঝতে কোনও সফলতা ছাড়াই আমি নিম্নলিখিতগুলি চেষ্টা করে অনেকটা গুগল করেছি:

root@sv01:~# echo -e "\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\\\ Hello!"
\ Hello!
root@sv01:~# echo -e "\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\\\ Hello!"
\\ Hello!
root@sv01:~# echo -e "\\\\\\\\\ Hello!"
\\\ Hello!
root@sv01:~# echo -e "\n Hello!"

 Hello!
root@sv01:~# echo -e "\\n Hello!"

 Hello!
root@sv01:~# echo -e "\\\n Hello!"
\n Hello!

আমি সেখানে সম্পূর্ণ হারিয়েছি, উদাহরণস্বরূপ, কেন তিনটি ব্যাকস্ল্যাশ কেবল একটি পিছনে স্ল্যাশ দেয়? আমি প্রত্যাশা করব: প্রথম দু'জন একজনের কাছে পালিয়ে যাবে, তৃতীয়টি পালাতে কিছুই খুঁজে পাবে না কারণ এটি স্ল্যাশ (প্রথম পরীক্ষায় লাইন) থেকে যাবে, তবে যা ঘটছে তা হ'ল তৃতীয়টি কেবল অদৃশ্য হয়ে গেছে।
কেন আমি চার থেকে একটি ব্যাকস্ল্যাশ পাচ্ছি \\\\ Hello? আমি প্রত্যাশা করব যে প্রতিটি জুটি একটি পিছনে স্ল্যাশ -> দুটি ব্যাকস্ল্যাশ দেবে।

Escaped n পালাতে আমার কেন শেষ ক্ষেত্রে তিনটি ব্যাকস্ল্যাশ দরকার? যে পলায়নের পটভূমিতে কি ঘটছে? এবং এটি \\nকেস থেকে আলাদা কীভাবে ?

পূর্ববর্তী লাইনে কী চলছে তার কোনও ব্যাখ্যা আমি প্রশংসা করি।


echo -eআচরণ কোনওভাবেই স্ট্যান্ডার্ড-সংজ্ঞায়িত নয় - pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html দেখুন । ইনপুটগুলির যে কোনও জায়গায় আক্ষরিক ব্যাকস্ল্যাশ থাকলে আউটপুট সম্পূর্ণরূপে সংজ্ঞায়িত হয় এবং একমাত্র অনুমোদিত বিকল্পটি -n(মানে একটি মান-সম্মতিযুক্ত বাস্তবায়নটির আউটপুটটিতে echo -eমুদ্রণ থাকবে -e)।
চার্লস ডাফি

... এমনকি যদি আপনি 100% নিশ্চিত হন যে আপনার শেলটি বাশ, তবুও echo -e নিরাপদ নয়: echoস্ট্যান্ডার্ড অনুসারে আচরণ করবে যদি উভয় posixএবং xpg_echoরানটাইম বিকল্পগুলি সক্ষম হয়, বা সমমানের বিল্ড-টাইম বিকল্পগুলির সাথে সংকলিত হয়। নিরাপদ অনুশীলনটি printfপরিবর্তে ব্যবহার করা হচ্ছে - উপরের লিঙ্কটির অ্যাপ্লিকেশন ব্যবহার এবং রেসেশন বিভাগটি দেখুন কীভাবে printfপ্রতিস্থাপন হিসাবে কাজটি করা যায় তা বর্ণনা করে echo
চার্লস ডাফি

উত্তর:


28

এটি কারণ bashএবং echo -eসম্মিলিত। থেকেman 1 bash

একটি অ-উদ্ধৃত ব্যাকস্ল্যাশ ( \) হ'ল পালানোর চরিত্র। এটি বাদে পরবর্তী চরিত্রের আক্ষরিক মান সংরক্ষণ করে <newline>। [...]

ডবল কোট অক্ষর আবদ্ধ কোট মধ্যে সব অক্ষরের আক্ষরিক মান অপরিবর্তিত, ব্যতিক্রম $, ' \, [...] ব্যাকস্ল্যাশ তার বিশেষ অর্থ শুধুমাত্র যখন নিম্নলিখিত অক্ষরগুলি এক দ্বারা অনুসৃত বজায়: $,' ", \বা <newline>

কথাটি হ'ল: ডাবল উদ্ধৃত ব্যাকস্ল্যাশ সবসময় বিশেষ হয় না।

echoসাধারণভাবে বিভিন্ন বাস্তবায়ন হয় , এটি একটি অন্তর্নির্মিত bash; এখানে গুরুত্বপূর্ণ বিষয়টি হ'ল এই আচরণ:

যদি -eকার্যকর হয়, নিম্নলিখিত ক্রমগুলি স্বীকৃত:
\\
ব্যাকস্ল্যাশ
[…]
\n
নতুন লাইন

এখন আমরা ডিকোড করতে পারি:

  1. echo -e "\ Hello!"- বিশেষ কিছু নয়, বিশেষ bashকিছু নয় echo; \থাকবে।
  2. echo -e "\\ Hello!"- প্রথম দ্বিতীয়টির সাথে আক্ষরিক আচরণ করতে \বলে ; উপরের হিসাবে পায় এবং কাজ করে।bash\echo\ Hello!
  3. echo -e "\\\ Hello!"- প্রথম দ্বিতীয়টির সাথে আক্ষরিক আচরণ করতে \বলে ; পায় এবং (কারণ ) এটি হিসাবে স্বীকৃতি দেয় ।bash\echo\\ Hello!-e\\\
  4. echo -e "\\\\ Hello!"- প্রথম দ্বিতীয়টির সাথে আক্ষরিক আচরণ করতে \বলে ; তৃতীয় চতুর্থ সম্পর্কে একই বলে; পায় এবং (কারণ ) এটি হিসাবে স্বীকৃতি দেয় ।bash\echo\\ Hello!-e\\\
  5. echo -e "\\\\\ Hello!"- প্রথম দ্বিতীয়টির সাথে আক্ষরিক আচরণ করতে \বলে ; তৃতীয় চতুর্থ সম্পর্কে একই বলে; শেষটি বিশেষ নয়; পায় এবং (কারণ ) এটি প্রাথমিক হিসাবে স্বীকৃতি দেয় , শেষটি অক্ষত থাকে।bash\echo\\\ Hello!-e\\\\

ইত্যাদি। আপনি দেখতে পাচ্ছেন, পরপর চারটি ব্যাকস্ল্যাশ ফলস্বরূপ একটি দেয়। এজন্য আপনার তিনটি পেতে আপনার (কমপক্ষে) নয় জন প্রয়োজন। 9 = 4 + 4 + 1।

এখন সাথে \n:

  1. echo -e "\n Hello!"- এর জন্য বিশেষ কিছু নেই bash, প্রতিধ্বনি একই স্ট্রিংটি পায় এবং (কারণ -e) এটি \nএকটি নিউলাইন হিসাবে ব্যাখ্যা করে ।
  2. echo -e "\\n Hello!"- হিসাবে bashব্যাখ্যা ; পায় এবং ফলাফল উপরের মত একই।\\\echo\n Hello!
  3. echo -e "\\\n Hello!"- bashপ্রাথমিক \\হিসাবে এর ব্যাখ্যা দেয় \; echoপায় \\n Hello!এবং (এর কারণে -e) এটি \\আক্ষরিক হিসাবে ব্যাখ্যা করে \যা মুদ্রণ করা দরকার।

(বিভিন্ন আচরণের কারণে ) বা (ভিন্ন আচরণের) 'পরিবর্তে ফলাফলগুলি ভিন্ন হবে ।"bash-eecho


1
আপনাকে অনেক ধন্যবাদ! সুতরাং দুটি পালানোর পদক্ষেপ রয়েছে, বাশ দ্বারা করা পদক্ষেপ এবং দ্বিতীয়টি -eবিচারকের দ্বারা দ্বিতীয়টি পাঠ দ্বারা ইতিমধ্যে বিচারকৃত বিচারটি সঠিক? যদি এটি সঠিক হয় তবে তা বিভ্রান্তি দূর করে। আপনি কীভাবে sedআচরণ করে তা উল্লেখ করতে পারেন ? এর পালানোর কৌশলটিতে এর নিজস্ব বিল্ড রয়েছে? সুতরাং আমি বলতে চাইছি এটি প্রতিধ্বনির মতো আচরণ করে -e?
মোহাম্মদ নুরাল্ডিন

2
@ মোহাম্মদ নূরল্ডিন ​​হ্যাঁ, দুটি পদক্ষেপ রয়েছে। আপনার আসল প্রশ্নটি যেমন রয়েছে ঠিক তেমন, আসুন এটি এটিকে জটিল করে তুলুন না sed। আপনি অন্য প্রশ্নটি জিজ্ঞাসা করতে পারেন ( sedকেবলমাত্র), প্রথমে নিজের গবেষণাটি করুন।
কামিল ম্যাকিয়েরোভস্কি

3
@ মোহাম্মাদ নুরাল্ডিন sedএকই বেসিক নীতিগুলি অনুসরণ করবেন: বাশ কমান্ড লাইনটিকে তার বিধি অনুসারে ব্যাখ্যা করবে, বিশ্লেষণ করবে (এবং সম্ভবত অপসারণ) উদ্ধৃতি এবং পলায়ন করবে। এর ফলাফলটি পাস হয়ে যায় sed, যা এর পালানোর নিয়ম অনুসারে ব্যাখ্যা করে । বিটিডাব্লু, আপনি এটিকে একক-উদ্ধৃত স্ট্রিং ব্যবহার করে সরল করতে পারেন bash, যেহেতু এর সাথে পালানো ব্যাখ্যার ব্যাশ নেই (বাশ দ্বারা) - বাশ একক-উদ্ধৃতি সরিয়ে দেয় এবং তাদের ভিতরে যা আছে তা সরাসরি কমান্ডের মধ্যে দিয়ে যায়।
গর্ডন ডেভিসন

echo -e "\\\n Hello!"ক্ষেত্রে এখনও আমার একটি ছোট সমস্যা আছে । এখানে বাশ পালাতে পারে, এবং এটি হয়ে যাবে \\n, তারপরে -eফলস্বরূপ দুটি \\nপিছনে পালাবে এবং তারপরে তারা হয়ে যাবে \n। এখন \nএটিকে নতুন লাইন তৈরি করার জন্য কে ব্যাখ্যা করবে? সাধারণত ক্ষেত্রে echo -e "\n Hello!", বাশ কিছুই করে না, এবং নতুন লাইন হিসাবে -eব্যাখ্যা করে \n। তবে প্রথম উল্লিখিত পরিস্থিতিতে ব্যাখ্যার প্রক্রিয়াটি ব্যাখ্যা করার আগে করা হয়েছিল \n। আপনি দয়া করে ব্যাখ্যা করতে পারেন?
মোহাম্মদ নুরাল্ডিন

1
ঠিক আছে আমার দোষ, আমি তাদের রাতের সাথে 2 দিনের জন্য এটি পড়ছি, সুতরাং স্পষ্টতই আমি মামলাগুলি মিশ্রিত করতে শুরু করেছি, আমি বিশ্বাস করি যে আমি অন্য কিছু পেয়েছিলাম sedযা গত রাতে আমাকে বিভ্রান্ত করেছিল (সম্ভবত আমি গতকাল কোনও ভুল করেছি), তবে এখন আমি echo -eএবং এর সাথে আবার একই চেষ্টা sedকরেছি এবং ব্যতীত আমি একই জিনিস পেয়েছি, ধন্যবাদ!
মোহাম্মদ নুরাল্ডিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.