প্রশ্ন কি "-বাশ:!": ঘটনা পাওয়া যায় না "


একটি bash শেল অধীনে নিম্নলিখিত নির্বাহ করার চেষ্টা করুন 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

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


90
2017-12-02 10:45


উত্স




উত্তর:


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


41
2017-12-02 16:31



আপনি সিনট্যাক্স পিছনে যুক্তি জানেন? এটা সত্যিই intuitative কাউন্টার মনে হয়। আপনি টাইপ চাই মনে হবে +H কিছু সক্রিয় করতে এবং -H কিছু নিষ্ক্রিয় করা। - PunkyGuy
@PunkyGuy: আমি এটির পিছনে ইতিহাস (শাস্তিমূলক উদ্দেশ্যে) জানি না, তবে ইউনিক্স বিকল্পগুলি সাধারণত হাইফেন (বা বিয়োগ) দিয়ে শুরু হয় এবং + যে ঠিক বিপরীত। - Dennis Williamson


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

!rm

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

!rm:p

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

চেষ্টা

echo reboot your instance\!

রক্ষা করার জন্য (অব্যাহতি) ব্যাশ থেকে বিস্ময় চিহ্ন।


86
2017-12-02 10:49



হ্যাঁ, তবে আমি যদি echo -e "কিছু পাঠ্য $ ENV_VAL কিছু বেশি পাঠ্য ব্যবহার করতে চাই তবে ঘটতে হবে \ n এখনই পুনরায় বুট করুন!" ? - Maxim Veksler
দুটি ইকো স্টেটমেন্ট লিখুন; আপনি বিনামূল্যে জন্য linefeed পেতে। - MadHatter
সহজ সমাধান একবারে একক উদ্ধৃতি এবং ডবল উদ্ধৃতি ব্যবহার করা হয়: echo -e "পাঠ্য \ n রিবুট করুন" '!' - mmey
এই sucks। যদি আমি বিস্ময়ের চিহ্ন থেকে পালাতে না পারি, তাহলে ব্যাশটি একটি উপযুক্ত ফিট করে। আমি যদি করা এটি অব্যাহতি, ব্যাকস্ল্যাশ চূড়ান্ত স্ট্রিং অন্তর্ভুক্ত করা হয়। কেন তুমি এটা করো, বাশ !! (pastebin.com/g4PYv56A) - Hubro
@ হিব্রো ন্যায্যতার সাথে, আমি নিশ্চিত নই যে এটা সব ব্যাশের দোষ। রুবি ব্যবহার করে কিছুটা জটিল বিষয় আপনার কাছে রয়েছে, যা কিছু খাবার খাওয়ার জন্য খাবার খাওয়াতে পারে এবং এটি আমার কাছে স্পষ্ট নয় যে অংশটি রুবি বা পালানোর অক্ষরগুলিকে শক্তিশালী করার জন্য কি অংশ রুবি খেলছে। - MadHatter


আপনার আসল সমস্যাটি সমাধানের জন্য, দুইটি উদ্ধৃতির পরিবর্তে একক উদ্ধৃতি ব্যবহার করে দেখুন। পরবর্তীতে, bash কমান্ডের ফলাফলটি প্রেরণের আগে নির্দিষ্ট অক্ষর প্রসারিত করার চেষ্টা করবে (এই ক্ষেত্রে প্রতিধ্বনি)। একক উদ্ধৃতি দিয়ে, bash সম্পূর্ণ স্ট্রিং, অপরিবর্তিত পাস।

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

মনে রাখবেন যে স্ক্রিপ্টে, সব ইতিহাস কমান্ডগুলি নিষ্ক্রিয় করা হয়েছে, কারণ এটি শুধুমাত্র একটি ইন্টারেক্টিভ শেলের মধ্যে জ্ঞান করে।

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


22
2017-12-02 11:02



!! প্রবেশ সম্পূর্ণ শেষ কমান্ড পূরণ করতে অসাধারণ দরকারী; বিশেষ করে sudo !! অথবা pfexec !! - jgoldschrafe
আমি সুন্দর ইউটিলিটি হতে সুডো এবং পিফেক্সেক খুঁজে পাই, কিন্তু এত উত্সাহী হওয়ার দরকার নেই। - LeartS
$_ bash এর চেয়ে আরও শেলগুলিতে কাজ করে এবং এটি একটি যথাযথ পরিবর্তনশীল, বিপরীত !$। (এবং @ লেয়ারস: আমি আপনার তামাশা এর ইমোটিকন অভাব পছন্দ।;)) - ΤΖΩΤΖΙΟΥ


শুধু একটি স্থান রাখুন! এবং "এটা কাজ করবে।

চিয়ার্স।


5
2017-09-25 07:06



আপনার সমাধানটি কেন কাজ করে তা ব্যাখ্যা করার জন্য দয়া করে ব্যাখ্যা করুন? - 200_success
এই কাজ কারণ Bash শুধুমাত্র চিকিত্সা! একটি বিশেষ অক্ষর হিসাবে এটি সরাসরি একটি অ হোয়াইটস্পেস চরিত্র দ্বারা অনুসরণ করা হয়। যাইহোক, এটি আপনার আউটপুটের জন্য অতিরিক্ত ফাঁকা যুক্ত করবে, যাতে সবসময় পছন্দসই নাও হতে পারে ... - mmey


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

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

নিম্নলিখিত হিসাবে স্ট্রিং আউটপুট আউটপুট হবে

echo 'Reboot your instance!'

নিম্নলিখিত কমান্ডটি চালানো হবে এবং স্ট্রিং সংযোজন করা হবে

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

2
2018-04-25 13:57





মধ্যে 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!

1
2017-07-12 14:43



সম্ভবত একটি বাগ, এখানে, আমি 4.4.12 আছে এবং এখনো আবার, আমি প্রয়োজন set +H বা উদ্ধৃতি। অথবা আপনি আছে set +H কোথাও (যেমন /etc/profile)। - Bodo Thiesen
ব্যবহার করে! -Char বাক্যটির শেষে না পরীক্ষা করে ব্যাশের ইভেন্ট সনাক্তকরণ এখনও জরিমানা করছে। সংস্করণ 4.3.30 ........ $ echo "আপনার বাক্যটি পুনরায় চেক করুন! Foo" bash:! Foo: ঘটনা পাওয়া যায় নি - JohnnyD92


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

cat <<EOF
Reboot your instance!
EOF

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


0
2017-07-07 11:41