Soru "-Bash:!” Nedir: etkinlik bulunamadı "


Aşağıdaki bir bash kabuk altında çalıştırmayı deneyin echo "Reboot your instance!"

Kurulumumda:

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

Herkes "bash olayları" nı açıklayabilir mi? Bu kavramı daha önce hiç duymadım. Ayrıca, nasıl çıkış yapmalıyım? cümlenin sonunda?


90
2017-12-02 10:45


Menşei




Cevaplar:


Kullanarak tarih değiştirmeyi kapatabilirsiniz. set +H.


41
2017-12-02 16:31



Sentaksın arkasındaki mantığı biliyor musun? Gerçekten karşı sezgisel görünüyor. Yazacağını düşünürdün +H bir şeyi etkinleştirmek ve -H bir şeyi etkisiz hale getirmek için - PunkyGuy
@PunkyGuy: Arkasındaki geçmişi (pun amaçlanmış) bilmiyorum, ancak Unix seçenekleri genellikle bir tire (veya eksi) ile başlar ve + bunun tam tersidir. - Dennis Williamson


! bash için özel bir karakterdir, önceki komutlara başvurmak için kullanılır; Örneğin,

!rm

"rm" dizesiyle başlayan son komutu geri çağırır ve çalıştırır.

!rm:p

"rm" dizesiyle başlayan son komutu geri çağırmaz, ancak çalıştırmaz. bash, ünlem işaretini echo "reboot your instance!" gibi "ünlem işareti hemen ardından karakter (ler) ile başlayan son komut yerine"Ve, tarihinizde, tek bir çift tırnak ile başlayan bir olayı (komuta) bulamadığını size söyler.

Deneyin

echo reboot your instance\!

Bash'tan ünlem işaretini korumak (kaçmak).


86
2017-12-02 10:49



Evet, ancak echo -e'yi kullanmak istersem de olmalısın "bazı metinler $ ENV_VAL biraz daha metin var \ nReboot now!" ? - Maxim Veksler
İki yankı ifadesi yazınız; hat beslemesini bedavaya alırsınız. - MadHatter
Basit çözüm, tek tırnak ve çift tırnakları bir kerede kullanmaktır: echo -e "Text \ nReeboot" '!' - mmey
Bu berbat. Ünlem işaretinden kaçmazsam, bash uygun olur. Eğer ben yap onu kaçış, ters eğik çizgi son dizeye dahil edilir. Bunu neden yapıyorsun Bash !! (pastebin.com/g4PYv56A) - Hubro
@Hubro adalet içinde, eminim ki bu tüm bash'ın hatası. Bir şeyler yapmak için ruby ​​kullanarak biraz karmaşık meseleleriniz var ve kaç tane karakterin soyulması veya takviye edilmesinde hangi parçanın yakut oynandığını bana açık değil. - MadHatter


Orijinal sorununuzu çözmek için, çift tırnak yerine tek tırnak kullanmayı deneyin. İkincisi ile, bash, sonuca komuta geçmeden önce belirli karakterleri genişletmeye çalışacaktır (bu durumda yankı). Tek tırnak ile, bash değişmeyen tüm dizgeyi geçer.

! Komut satırı geçmişine başvurmak için komutlarda kullanılır. Görmek: http://tldp.org/LDP/abs/html/abs-guide.html#HISTCOMMANDS tam set için. Yukarıdaki örnekle, bash genişletmeye çalışıyor !" yankı bir bakış atmadan önce bir olaya bir referans olarak, dolayısıyla hata.

Komutlarda, herşey Tarihçe komutları, etkileşimli bir kabukta yalnızca anlamlı oldukları için devre dışı bırakılır.

Düzenli olarak kullandığım tek şey !$. Önceki komutun son argümanına kadar genişler. Bu yerlerde kullanışlı bir kestirme.


22
2017-12-02 11:02



!! Girilen son komutun tamamını doldurmak son derece yararlıdır; özellikle, sudo !! veya pfexec !! - jgoldschrafe
Ayrıca, sudo ve pfexec'i güzel araçlar olarak görüyorum, ama bu kadar hevesli olmaya gerek yok. - LeartS
$_ bash'den daha fazla kabukta çalışır ve uygun değil !$. (ve @LeartS: Şakanın ifadelerini sevmemden hoşlandım.) - ΤΖΩΤΖΙΟΥ


Sadece bir boşluk koy! ve "işe yarayacak.

Şerefe.


5
2017-09-25 07:06



Çözümünüzün neden işe yaradığına dair bir açıklama ekleyebilir misiniz? - 200_success
Bu işe yarar çünkü Bash sadece davranır! özel bir karakter olarak, doğrudan boşluk olmayan bir karakterle izleniyorsa. Ancak, çıktınıza ekstra bir boşluk da katacak, böylece her zaman istenmeyebilir ... - mmey


Evet, ! bash için özel bir karakterdir, önceki komutlara başvurmak için kullanılır.

Durumun üstesinden gelebileceğiniz yollardan birkaçı

Aşağıdaki gibi dize çıktı

echo 'Reboot your instance!'

Aşağıdaki komutu yürütecek ve dizeyi birleştirecek

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

2
2018-04-25 13:57





İçinde bash 4.3 artık tek tırnak kullanmanıza gerek yok gibi görünüyor 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



Muhtemelen bir böcek, çünkü burada 4.4.12 var ve bir daha ihtiyacım var. set +H veya alıntı. Ya da var set +H bir yerlerde /etc/profile). - Bodo Thiesen
Cümlenin sonunda değil! -Char, kullanıcının olay tespitini doğrulamaya devam eder. Sürüm 4.3.30 ........ $ echo "Cümlenizi tekrar kontrol edin! Foo" bash:! Foo: event not found - JohnnyD92


Ayrıca kullanabilirsiniz heredoc:

cat <<EOF
Reboot your instance!
EOF

Bu durumda can sıkıcı bir durum çünkü bir tek liner değil, daha uzun komutlar (bash betiği yazmak gibi) için harika çalışıyor.


0
2017-07-07 11:41