Bashは、次の質問への回答で説明されているように、履歴拡張に感嘆符を使用します。この問題(たとえば、sudo !!
前のコマンドライン実行を使用するsudo
)しかし、次のコマンド(単一の感嘆符など)を実行するタスクを説明する場所が見つかりません。
!
何も印刷せずに1で終了するようですが、なぜこれが起こるのかはわかりません。オンラインとBashのマニュアルページを見ましたが、「予約語」という事実以外は何も見つかりませんでした。しかし、}
次のコマンドを実行しました。
}
印刷エラー:
bash: syntax error near unexpected token `}'
答え1
孤独!
コマンドの開始時にコマンドまたはパイプの終了状態を無効にします。:コマンドが終了すると(失敗)0
に切り替わり、ゼロ以外の値で終了すると(成功)に終了に1
切り替わります。0
この使用法は Bash マニュアルに文書化されています。
予約語「!」がパイプの前に来る場合、終了状態は上記の終了状態の論理的否定です。
後続のコマンドを持たないAは、!
何もせずにtrueを返す空のコマンドを無効にします(:
コマンド)。したがって、trueをfalseに反転し、状態1で終了しますが、エラーは発生しません。
!
中には他の用途もあります。test
そして[[
条件付きテストを無効にするコマンド。これらはあなたが見ているものとは何の関係もありません。あなたの質問とそのような場合は、歴史的な拡張とは関係なく、他の用語!
とは別のものです。
答え2
bashのマニュアルセクションで文書化された単一の感嘆符を見つけることができます。3.2.2 パイプライン
予約語「!」がパイプの前に来る場合、終了状態は上記の終了状態の論理的否定です。
$ ! true; echo $?
1
$ ! false; echo $?
0
祭りに戻る3.2.4.2 条件付き構成
!表現する
式が偽であれば真です。
!表現
expr が偽ならば真です。
!
スペース、タブ、行末、「=」、または「(」(組み込みのshoptを使用してextglobシェルオプションが有効になっている場合)が続かない限り、履歴の交換が開始されることにも注意する必要があります。
答え3
!
比較と手段として使われるのでいいえ。
たとえば、
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
答え4
!文字列の後には、指定された文字列で始まる最新のコマンド(まだコマンドバッファにあります)を実行します。おそらく、殻が見つかったばかりです。いいえ前のコマンドは<null>で始まりました。