ターミナル/バッシュのエコシンボル

ターミナル/バッシュのエコシンボル

端末にメッセージを表示しようとしたときに「!」を使用できないのはなぜですか?たとえば、

echo -e "Hello\nWorld!"

bash は次のコマンドを返します。

bash !: event not found

答え1

この!文字は「バン」と呼ばれ、bashコマンド履歴を呼び出すために使用されます。次の 4 つの方法で使用できます。

!<firstFewCharsOfPreviousCommand> 

例:

!rm

その後、「rm」で始まって最後に実行したコマンドに移動し、コマンド全体を実行します。はい注意深いrm などの潜在的に破壊的なコマンドを繰り返すことで、意図しない他のコマンドを誤って実行する可能性があります。上記は、bashのCTRL-Rリバース検索機能を使用する方がより安全な選択であることを示しています。

!<indexInCommandHistory>

例:

!433

インデックスは、コマンドを実行したときにコマンドの横に表示される番号ですhistory

!!

それが全部なので、はいは必要ありません。前のコマンドを再実行します(ほとんどのLinuxディストリビューションの上矢印と同じ)。

!$

例:

# ls -lh /etc/fstab
# vi !$

もう1つのリテラルは、bashが実行したときに!$最後の単語(空白なしの文字列)に置き換えられます。

最後のコマンドで見たように、より大きいまたは他のコマンドの一部として使用することもできます。他の例!!

[root@hypervisor libsceptre]# echo hey
hey
[root@hypervisor libsceptre]# echo !!
echo echo hey    <-- printed to stderr so you know what !! was expanded to 
echo hey
[root@hypervisor libsceptre]#

bashが文字を解釈するのではなく、何らかの理由で文字をリテラルとして扱うようにするには、テキストを一重引用符で囲むことができます。

[root@hypervisor libsceptre]# echo -e "Hello\nWorld!"
-bash: !": event not found
[root@hypervisor libsceptre]# echo -e 'Hello\nWorld!'
Hello
World!
[root@hypervisor libsceptre]#

コマンドが機能しない理由は、二重引用符で始まる最後のコマンド(最初の例で説明した機能)を見つけるために見つからないためです。

答え2

履歴拡張を使用しない場合(明確に使用しない場合)、奇妙な引用規則と抑制規則を学習するのではなく、無効にする必要があります。

set +Hそれともset +o histexpandそれから抜け出してください。echo $-(「H」はアクティブを意味します)または()でアクティブであるset -oことを確認できますhistexpand

答え3

爆発を避けるべきです:

echo -e "Hello\nWorld"\!
メモ:引用符の外側に爆発を含めることは意図的なものです。それ以外の場合は\!エコーです。

答え4

二重引用符内の特別な意味は!まだ有効です。!たとえば、整数nを引数として使用し、シェル履歴でn番目のコマンドを実行するシェルキーワードです。混乱を避けるために、単一引用符またはエスケープ文字を使用してください。

から履歴コマンド拡張の詳細を読むことができますman history

関連情報