web-dev-qa-db-ja.com

Bashで感嘆符を1つ入力するとどうなりますか?

この質問 への回答で説明されているように、bashは履歴の展開に感嘆符を使用します(例:Sudo !!Sudoで前のコマンドラインを実行します)。ただし、次のコマンド(つまり、1つの感嘆符)を実行すると何が行われるかを説明する場所はどこにも見つかりません。

!

何も表示されずに1で終了するように見えますが、なぜそれが行われるのかはわかりません。私はオンラインとBashのマニュアルページを調べましたが、「予約語」であるという事実を除いて何も見つかりません。ただし、}も同様で、これを実行します。

}

エラーを出力します:

bash: syntax error near unexpected token `}'
21
Ash

コマンドの開始時の唯一の !は、コマンドまたはパイプラインの終了ステータスを無効にします :コマンドが0を終了すると、1(失敗)、それがゼロ以外で終了する場合、0(成功)終了に変わります。

この使用法は、Bashのマニュアルに記載されています。

予約語 ‘!’がパイプラインの前にある場合、終了ステータスは上記のように終了ステータスの論理否定です。

次のコマンドがない!は、何もせずにtrueを返す空のコマンドを無効にします( the :コマンド と同等)。したがって、trueをfalseに反転し、ステータス1で終了しますが、エラーは生成されません。


test および ! コマンドでは、条件テストを無効にする[[の他の使用法もあります。これらはあなたが見ているものとは無関係です。あなたの質問とそれらの場合の両方で、それは履歴の拡大とは関係がなく、!は他の用語から分離されています。

48
Michael Homer

Bashのマニュアルセクションに記載されている単一の感嘆符を見つけることができます .2.2 Pipelines

予約語 ‘!’がパイプラインの前にある場合、終了ステータスは上記のように終了ステータスの論理否定です。

$ ! true; echo $?
1
$ ! false; echo $?
0

また、セクション .2.4.2条件付き構成体

!表情

式が偽の場合は真。


また、セクション 4.1 Bourne Shell Builtins

! expr

Exprがfalseの場合はtrue。


また、!は、スペース、タブ、行末、 ‘=’または ‘(’(shoptビルトインを使用してextglobシェルオプションが有効になっている場合)が後に続かない限り、履歴の置換を開始します。

11
jesse_b

!は比較で使用され、[〜#〜] not [〜#〜]を意味します。

例えば:

a=3
b=2

[ $a -eq $b ] && echo "Equal"
[ ! $a -eq $b ] && echo "Not equal"
# of cause last comparison is possible to write as:
[ $a -eq $b ] || echo "Not equal"

[ $a -eq $b ]
echo $?
1
[ ! $a -eq $b ]
echo $?
0
0
Yurij Goncharuk