"-বাশ:!" কী: ইভেন্টটি পাওয়া যায়নি "


114

ব্যাশ শেলের নীচে নিম্নলিখিতগুলি সম্পাদন করার চেষ্টা করুন echo "Reboot your instance!"

আমার ইনস্টলেশন:

root@domU-12-31-39-04-11-83:/usr/local/bin# bash --version
GNU bash, version 4.1.5(1)-release (i686-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
root@domU-12-31-39-04-11-83:/usr/local/bin# uname -a
Linux domU-12-31-39-04-11-83 2.6.35-22-virtual #35-Ubuntu SMP Sat Oct 16 23:57:40 UTC 2010 i686 GNU/Linux
root@domU-12-31-39-04-11-83:/usr/local/bin# echo "Reboot your instance!"
-bash: !": event not found

কেউ কি দয়া করে ব্যাখ্যা করতে পারেন "বাশ ইভেন্টগুলি" কী? আমি এই ধারণাটি আগে কখনও শুনিনি। এছাড়াও, আমার কীভাবে আউটপুট করা উচিত "!" বাক্য শেষে?

উত্তর:


53

আপনি ব্যবহার করে ইতিহাসের বিকল্পটি বন্ধ করতে পারেন set +H


2
সিনট্যাক্সের পিছনে যুক্তি কি জানেন? এটি সত্যিই পাল্টা অন্তর্নিহিত মনে হয়। আপনি মনে করেন আপনি +Hকিছু সক্ষম করতে এবং -Hকিছু অক্ষম করতে টাইপ করবেন ।
গ্যাভিন ওয়ার্ড

7
@ পঙ্কিগুই: আমি এর পিছনে ইতিহাস (পাং উদ্দেশ্যে) জানি না, তবে ইউনিক্স অপশনগুলি সাধারণত হাইফেন (বা বিয়োগ) দিয়ে শুরু হয় এবং +কেবল এর বিপরীত।
ডেনিস উইলিয়ামসন

105

!বাশ করার জন্য একটি বিশেষ চরিত্র, এটি পূর্ববর্তী আদেশগুলি উল্লেখ করতে ব্যবহৃত হয়; যেমন,

!rm

"rm" স্ট্রিং দিয়ে শুরু হওয়া শেষ কমান্ডটি পুনরায় স্মরণ করে এবং কার্যকর করবে

!rm:p

"rm" স্ট্রিংয়ের সাথে শুরু হওয়া শেষ কমান্ডটি পুনরায় স্মরণ করা হবে না তবে কার্যকর করবে ute বাশ বিস্মৃত চিহ্নটির ব্যাখ্যা দিচ্ছেন echo "reboot your instance!"" এখানে বর্ণিত চিহ্নগুলি অবিলম্বে বর্ণ (গুলি) দিয়ে শুরু হওয়া সর্বশেষ আদেশের বিকল্প " হিসাবে এই শব্দটির ব্যাখ্যা দেওয়া হচ্ছে এবং আপনার প্রতি কৌতূহল বোধ করছে যে এটি আপনার ইতিহাসে কোনও ইভেন্ট (কমান্ড) খুঁজে পাচ্ছে না যা একটি একক দিয়ে শুরু হয়েছিল it ডাবল উদ্ধৃতি।

চেষ্টা

echo reboot your instance\!

বাশ থেকে বিস্মৃত চিহ্নটি রক্ষা করতে (পালাতে)


হ্যাঁ, তবে ঘটতে হবে যদি আমি প্রতিধ্বনি ব্যবহার করতে চাই - "কিছু পাঠ্য $ ENV_VAL আরও কিছু পাঠ্য \ n এখনই রিবুট করুন!" ?
ম্যাক্সিম ভেক্সলার 13

1
দুটি প্রতিধ্বনি বিবৃতি লিখুন; আপনি বিনামূল্যে লাইনফিড পান।
ম্যাডহ্যাটার

1
সহজ সমাধানটি একবারে একক উদ্ধৃতি এবং ডাবল উদ্ধৃতি ব্যবহার করা: প্রতিধ্বনি-e "পাঠ্য \ n রিবুট" '!'
mmey

4
এই স্তন্যপান। যদি আমি বিস্মৃত চিহ্নটি থেকে বাঁচতে না পারি তবে ব্যাশ একটি ফিট নিক্ষেপ করবে। যদি আমি এটি থেকে বাঁচতে পারি তবে ব্যাকস্ল্যাশটি চূড়ান্ত স্ট্রিংয়ের অন্তর্ভুক্ত। বাশ তুমি কেন এমন করছো! ( পেস্টবিন.
com

2
@ হুব্রো ন্যায্যতা, আমি নিশ্চিত নই যে এটাই সব বাশের দোষ। জিনিসগুলিকে বাশানোর জন্য রুবি ব্যবহার করে আপনার কিছুটা জটিল বিষয় রয়েছে এবং এ বিষয়টি আমার কাছে স্পষ্ট নয় যে রুবি অংশটি কীভাবে বাঁচাচ্ছে বা পালানোর চরিত্রগুলি আরও শক্তিশালী করতে পারে?
ম্যাডহ্যাটার

25

আপনার আসল সমস্যাটি সমাধান করতে, ডাবল কোটের পরিবর্তে একক উদ্ধৃতি ব্যবহারের চেষ্টা করুন। পরেরটির সাথে, বাশ কমান্ডে ফলাফলটি প্রেরণ করার আগে নির্দিষ্ট অক্ষরগুলি প্রসারিত করার চেষ্টা করবে (এই ক্ষেত্রে প্রতিধ্বনি)। একক উদ্ধৃতি সহ, ব্যাশ অপরিবর্তিতভাবে পুরো স্ট্রিংটি পাস করে।

!কমান্ড লাইনের ইতিহাস উল্লেখ করতে কমান্ড ব্যবহার করা হয়। দেখুন: একটি সম্পূর্ণ সেটের জন্য http://tldp.org/LDP/abs/html/abs-guide.html#HISTCOMMANDS । উপরোক্ত উদাহরণ সহ, !"প্রতিধ্বনিত প্রতিধ্বনি একবার দেখার আগে কোনও ইভেন্টের উল্লেখ হিসাবে প্রসারিত করার চেষ্টা করছে , সুতরাং ত্রুটি।

নোট করুন যে স্ক্রিপ্টগুলিতে, সমস্ত ইতিহাস কমান্ড অক্ষম করা হয়েছে, কারণ তারা কেবল ইন্টারেক্টিভ শেলটিতেই তা বোঝায়।

আমি নিয়মিত ভিত্তিতে কেবলমাত্র একটাই ব্যবহার করি !$। এটি পূর্ববর্তী কমান্ডের শেষ যুক্তিতে প্রসারিত হয়। এটি জায়গাগুলিতে একটি দরকারী শর্টহ্যান্ড।


4
!!প্রবেশ করা শেষ কমান্ডটি পূরণ করার জন্য উল্লেখযোগ্যভাবে কার্যকর; বিশেষত, sudo !!বাpfexec !!
jgoldschrafe

2
আমি সুডো এবং পেফেক্সেকও খুব ভাল উপযোগী হতে পাই তবে এত উত্সাহী হওয়ার দরকার নেই।
LeartS

$_বাশের চেয়ে বেশি শেলগুলিতে কাজ করে এবং এটি যথাযথ পরিবর্তনশীল, ভিন্ন !$। (এবং @ লেয়ার্টস: আপনার রসিকতার ইমোটিকনের অভাবটি আমি পছন্দ করেছি;))
ΤΖΩΤΖΙΟΥ

7

শুধু একটা জায়গা রেখে দিন! এবং "এটি কাজ করবে তার চেয়ে বেশি।

চিয়ার্স।


2
আপনার সমাধান কেন কাজ করে সে সম্পর্কে আপনি দয়া করে একটি ব্যাখ্যা যুক্ত করতে পারেন?
200_সুচি

2
এটি কাজ করে কারণ বাশ কেবলমাত্র আচরণ করে! বিশেষ চরিত্র হিসাবে যদি এটি সরাসরি কোনও শ্বেতস্থান অক্ষর অনুসরণ করে। তবে এটি আপনার আউটপুটে একটি অতিরিক্ত ফাঁকা যোগ করবে, যাতে সর্বদা পছন্দসই না হয় ...
mmey

2

হ্যাঁ, ! বাশ করার জন্য একটি বিশেষ চরিত্র এটি পূর্ববর্তী কমান্ডগুলি উল্লেখ করতে ব্যবহৃত হয়।

পরিস্থিতি সামাল দিতে পারে এমন কয়েকটি উপায়

নিম্নলিখিতটি স্ট্রিংটিকে যেমন আউটপুট দেবে

echo 'Reboot your instance!'

নিম্নলিখিতটি কমান্ডটি কার্যকর করবে এবং স্ট্রিংটিকে সংযুক্ত করবে

echo 'escaping #'" adding `which python` to the string"
echo '#!'`which python`

1

এতে bash 4.3মনে হয় আপনার আর একক উদ্ধৃতি বা ব্যবহারের দরকার নেই set +H:

$ bash --version
GNU bash, version 4.3.46(1)-release (x86_64-unknown-linux-gnu)
[...]
$ echo "Reboot your instance!"
Reboot your instance!

সম্ভবত একটি বাগ, কারণ এখানে, আমার কাছে 4.4.12 রয়েছে এবং আবারও আমার দরকার set +Hবা উদ্ধৃতি দরকার । অথবা আপনি set +Hকোথাও (মত /etc/profile) আছে।
বোডো থিয়েসন

বাক্যটির শেষে -চার ব্যবহার না করে বাশের ইভেন্ট সনাক্তকরণটি এখনও ঠিকঠাকভাবে কাজ করছে কিনা তা যাচাই করে। ইভেন্ট পাওয়া: VERSION 4.3.30 ........ $ প্রতিধ্বনি ব্যাশ: foo বিন্যাস "আপনার বাক্য আবার পরীক্ষা foo বিন্যাস!"!
JohnnyD92

0

আপনি একটি হেরডোকও ব্যবহার করতে পারেন :

cat <<EOF
Reboot your instance!
EOF

এটি এই ক্ষেত্রে বিরক্তিকর কারণ এটি ওয়ান-লাইনার নয় তবে দীর্ঘ কমান্ডের জন্য (যেমন কোনও বাশ স্ক্রিপ্ট লেখার জন্য) দুর্দান্ত কাজ করে।

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