Bashで単一の感嘆符を入力するとどうなりますか?


20

Bashは、この質問に対する回答で説明されているように、履歴の展開に感嘆符を使用します(たとえばsudo !!、前のコマンドラインをで実行しますsudo)。ただし、次のコマンド(つまり、単一の感嘆符)の実行内容を説明する場所は見つかりません。

!

何も印刷せずに1で終了するように見えますが、なぜそうなるのかわかりません。私はオンラインでBashのマニュアルページを見ましたが、「予約語」であるという事実以外には何も見つかりませんでした}

}

エラーを出力します:

bash: syntax error near unexpected token `}'

1
なし。!履歴展開式の「開始」を示します。
ヨルダン

回答:


47

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

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

予約語「!」パイプラインに先行する場合、終了ステータスは、上記のように終了ステータスの論理否定です。

!なし次のコマンドでは何もして真を返す(に相当しない、空のコマンド、否定コマンドを)。したがって、trueをfalseに反転し、ステータス1で終了しますが、エラーは発生しません。:


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


5
実際に実行される内容と、それがリターンコードを説明する理由を説明する最初の回答に対して+1
ジェフシャラー

11

bashのマニュアルセクション3.2.2パイプラインに記載されている単一の感嘆符を見つけることができます

予約語「!」パイプラインに先行する場合、終了ステータスは、上記のように終了ステータスの論理否定です。

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

セクション3.2.4.2条件付き構成

!表現

式が偽であれば真。


セクション4.1 Bourne Shell Builtins

!expr

exprが偽であれば真。


また!、スペース、タブ、行末、「=」または「(」(extglobシェルオプションがshoptビルトインを使用して有効になっている場合)が後に続かない限り、履歴置換が開始されることに注意してください。


0

!は比較に使用され、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

1
これ!は、testコマンドの引数としての意味(bashの組み込みバージョンを含む)であり、!コマンドの位置で使用される場合の意味ではありません。
ジル「SO-停止されて悪」

1
! [...]この場合、質問に一致する必要があります。
マイケルホーマー

@Gillesと@Michael Homerに同意しました。私はそれ[]がわかっていましたtest。私は少し急いでいます。
ユリゴンチャルク18

-2

! 組み込みコマンドは、パイプラインの意味を逆にします。

その他の用途:

#! 組み込みコマンド。名前付きインタープリターを呼び出してスクリプトを実行します。

! イベント指定子。コマンドラインの単語を履歴置換としてマークします

!= 不等式演算子

$! シェル変数。最後のバックグラウンドコマンドのプロセス番号を返します。


追加するだけで、!$を使用して、次のように前のコマンドの最後の単語を使用できます。 ls -l /tmp cd !$ これにより、/ tmpディレクトリに移動します。
ホッピングバニー

-3

!後に文字列を指定すると、指定した文字列で開始された最新の前のコマンド(まだコマンドバッファーにある)が実行されます。シェルは以前のコマンドが<null>で始まっていないことを発見したのかもしれません


3
あなたは質問に与えられた文字列がないことに気付きました...?
ジェフシャラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.