কেন ডাবল উদ্ধৃতিগুলির মধ্যে বিস্মৃত চিহ্নটি বাশ ত্রুটির কারণ ঘটায়?


25

দয়া করে এই আদেশগুলি দেখুন:

$ notify-send SYNC TIME!
$ notify-send 'SYNC TIME!'
$ notify-send "SYNC TIME!"
bash: !": event not found
$

প্রথম দুটি কমান্ড প্রত্যাশা অনুযায়ী একটি নোটিফিকেশন বুদবুদ উত্পাদন করে। তৃতীয়টি ত্রুটিটি দেখায়।

এবং

$ echo SYNC TIME!
SYNC TIME!
$ echo 'SYNC TIME!'
SYNC TIME!
$ echo "SYNC TIME!"
bash: !": event not found
$

এখানে পাশাপাশি, echoপ্রথম দুটি কমান্ডের জন্য কাজ করে তবে তৃতীয় নয়।

এখানে আরও সমস্যা (যদিও আমি এটি ব্যবহারের পরিকল্পনা করছিলাম না): উভয়ই দিন notify-send "SYNC!TIME"এবং echo "SYNC!TIME"দিন bash: !TIME": event not found

কিন্তু উভয় notify-sendএবং echoসঙ্গে কাজ"SYNC! TIME"

কেউ দয়া করে ব্যাখ্যা করতে পারেন কেন bash: !": event not foundত্রুটিটি উপস্থিত হয়?

উত্তর:


31

!ব্যাশ এ ডিফল্ট ইতিহাস সম্প্রসারণ চরিত্র, অধ্যায় "ইতিহাস সম্প্রসারণ" এ দেখতে ব্যাশ র manpage

  • !হিসাবে একক উদ্ধৃতি দ্বারা আবদ্ধ থাকলে ইতিহাসের প্রসার ঘটবে না

    notify-send 'SYNC TIME!'
  • !স্থান, ট্যাব, নিউলাইন, ক্যারেজ রিটার্ন, বা =যেমন হিসাবে অনুসরণ করা হয় তা ইতিহাসের সম্প্রসারণ হয় না

    notify-send SYNC TIME!
  • ইতিহাস সম্প্রসারণ করে গ্রহণ জায়গা

    echo "SYNC TIME!"

    সুতরাং যদি "আপনার ইতিহাসে কোনও কমান্ড শুরু না হয় তবে আপনি একটি ত্রুটি পাবেন


4
আপনার .bashrcলাইনে যুক্ত করে এই দুর্ব্যবহারটি ঠিক করা যেতে পারে set +H। নোট যে !স্ক্রিপ্টিং ইতিমধ্যে অ বিশেষ; এটিকে বিশেষ হিসাবে বিবেচনা করা অনেক মান-অনুসারে স্ক্রিপ্টগুলি ভেঙে দেয়। ইন্টারেক্টিভ শেলগুলিতে এটি কেবল "বিশেষ" হিসাবে বিবেচিত হবে এবং আপনি এটি ঠিক না করা পর্যন্ত কেবল ডিফল্টরূপে। :-)
আর ..

15

কারণ ব্যাশে, !একটি সংরক্ষিত শব্দ (ঠিক আছে, চরিত্র), এর বিভিন্ন প্রসঙ্গে বিশেষ অর্থ রয়েছে। এই বিশেষ ক্ষেত্রে, আপনি ইতিহাস অনুসন্ধানে এর তাত্পর্যকে অনেক পিছিয়ে যাচ্ছেন। থেকে man bash:

   History expansions introduce words from the history list into the input
   stream, making it easy to repeat commands, insert the  arguments  to  a
   previous command into the current input line, or fix errors in previous
   commands quickly.

  [...]

   History expansions are introduced by
   the appearance of the  history  expansion  character,  which  is  !  by
   default.   Only  backslash  (\) and single quotes can quote the history
   expansion character.

মূলত, এর অর্থ হ'ল বাশ অক্ষরের পরে অক্ষরগুলি নেবে !এবং আপনার ইতিহাসটি প্রথম কমান্ডের জন্য অনুসন্ধান করবে যা এটি খুঁজে পেতে পারে যা এই অক্ষরগুলির সাথে শুরু হয়। ব্যাখ্যা করার চেয়ে এটি প্রদর্শন করা সহজ:

$ echo foo
foo
$ !e
echo foo
foo

!সক্রিয় ইতিহাস সম্প্রসারণ, যা দিয়ে শুরু প্রথম কমান্ড মিলেছে eযা পূর্বে চালানো ছিল echo fooযা পরে আবার চালাতে হয়। সুতরাং, যখন আপনি লিখেছিলেন "SYNC TIME!", বাশ হ'ল !", অনুসন্ধানের ইতিহাসটি কমান্ডের সাথে অনুসন্ধানের ইতিহাসটি "ব্যর্থ হয়েছে এবং এটি সম্পর্কে অভিযোগ করেছে। উদাহরণস্বরূপ, আপনি চালিয়ে একই ত্রুটি পেতে পারেন !nocommandstartswiththis

বিস্ময়কর চিহ্নটি মুদ্রণ করতে আপনাকে এ দুটি উপায়ের একটিতে এড়াতে হবে:

echo 'Hello world!'
echo Hello world\!

6
echo Hello world!কাজ করে --- ইতিহাসের বিস্তার ফাঁকা দ্বারা চালিত হয় না ;-) (আহ, চমৎকার কোণার কেস ...)
রোমানো

1
কম্বলগুলির চেয়ে বিস্ময়কর চিহ্নটি থেকে বেরিয়ে যাওয়ার উপর নির্ভর করা ভাল।
এহতেশ চৌধুরী 12

1
@ রোমানো আমি এমন আচরণের দিকনির্দেশনা দেওয়ার পরিবর্তে স্পষ্টভাবে বলতে পছন্দ করি যে এটি পরিবর্তন করা সম্ভব
ব্রেইম

!একটি হল সংরক্ষিত শব্দ মধ্যে bash, যেমন POSIX এছাড়াও ঘোষণা করে । তবে আমি দৃ sure়ভাবে নিশ্চিত যে এর ইতিহাসের বিকাশের ক্ষেত্রে এর ভূমিকা সম্পূর্ণরূপে সম্পর্কিত নয় এবং ডাবল উদ্ধৃতিতে এর চিকিত্সার সাথে অপ্রাসঙ্গিক। !এটি একটি সংরক্ষিত শব্দ, কারণ এটি একটি কমান্ড / পাইপলাইনের প্রস্থান স্থিতিকে অবজ্ঞা করে, সুতরাং এটি একটি আদেশ হিসাবে ব্যবহার করা যায় না। অন্য কোনও সংরক্ষিত শব্দ "উদ্ধৃত প্রসঙ্গে বিশেষ নয় , যদিও $এটি কোনও সংরক্ষিত শব্দ নয় তবে এটি বিশেষভাবে বিবেচিত হয়।
এলিয়াহ কাগন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.