Spróbuj wykonać następujące czynności pod powłoką bash echo "Reboot your instance!"
W mojej instalacji:
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
Czy ktoś może wyjaśnić, co to są „imprezy bashowe”? Nigdy wcześniej nie słyszałem o tej koncepcji. Jak mam wypisać „!” na końcu zdania?
+H
aby włączyć lub-H
wyłączyć coś.+
jest po prostu odwrotnością.!
jest znakiem specjalnym do bash, służy do odwoływania się do poprzednich poleceń; na przykład,przywoła i wykona ostatnie polecenie, które rozpoczęło się od łańcucha „rm”, oraz
przywoła, ale nie wykona ostatniego polecenia, które rozpoczęło się od łańcucha „rm”. bash interpretuje wykrzyknik
echo "reboot your instance!"
jako „ zastąp tutaj ostatnie polecenie, które zaczyna się od znaku (ów) bezpośrednio po wykrzykniku ”, i narzeka, że nie może znaleźć zdarzenia (polecenia) w twojej historii, które zaczęło się od jednego cudzysłów.Próbować
w celu ochrony (ucieczki) wykrzyknika przed uderzeniem.
źródło
Aby rozwiązać pierwotny problem, spróbuj użyć pojedynczych cudzysłowów zamiast podwójnych. W tym drugim przypadku bash podejmie próbę rozwinięcia niektórych znaków przed przekazaniem wyniku do polecenia (w tym przypadku wykonaj echo). W przypadku pojedynczych cudzysłowów bash przekazuje cały ciąg znaków bez zmian.
!
jest używany w poleceniach w celu odniesienia do historii wiersza poleceń. Zobacz: http://tldp.org/LDP/abs/html/abs-guide.html#HISTCOMMANDS dla pełnego zestawu. W powyższym przykładzie bash próbuje rozwinąć się!"
jako odwołanie do zdarzenia, zanim echo się zajmie, stąd błąd.Zauważ, że w skryptach wszystkie polecenia historii są wyłączone, ponieważ mają one sens tylko w interaktywnej powłoce.
Jedynym, z którego regularnie korzystam, jest
!$
. Rozwija się do ostatniego argumentu poprzedniego polecenia. W niektórych miejscach jest to przydatny skrót.źródło
!!
wypełnienie ostatniego wpisanego polecenia jest niezwykle przydatne; w szczególności,sudo !!
lubpfexec !!
$_
pracuje w więcej niż powłoki bash i jest to właściwa zmienna, w przeciwieństwie!$
. (i @LeartS: Podobał mi się brak emotikonów twojego dowcipu;))Po prostu wstaw odstęp! i „niż to zadziała.
Twoje zdrowie.
źródło
Tak, ! jest znakiem specjalnym do bash, służy do odwoływania się do poprzednich poleceń.
Kilka sposobów poradzenia sobie z sytuacją
Poniższy kod wyświetli taki, jaki jest
Następujące polecenie wykona polecenie i połączy łańcuch
źródło
W
bash 4.3
wydaje się nie trzeba już używać apostrofów lubset +H
:źródło
set +H
lub cytować. Lub maszset +H
gdzieś (jak w/etc/profile
).Możesz także użyć heredoc :
W tym przypadku jest to denerwujące, ponieważ nie jest to jedna linijka, ale w przypadku dłuższych poleceń (takich jak pisanie skryptu bash), działa świetnie.
źródło