1. 概要

このチュートリアルでは、シェルコマンドでのダブルダッシュの使用について説明します。 それが何をするのか、そしていつそれが必要になるのかを見ていきます。

2. それは何をするためのものか?

ダブルダッシュ シェルコマンドでは、オプションの終了を通知し、それ以降のオプション処理を無効にします。 grep コマンドを使用して、これが実際に動作することを確認してみましょう。

ファイルdata.txthelloのオカレンスを検索するシナリオを想像してみてください。

$ grep hello data.txt

このコマンドは、指定されたファイルから文字列 hello のすべてのオカレンスを出力します。しかし、 hello、の代わりに、「-こんにちは”?

同じアプローチを使用すると、エラーが発生します。

$ grep "--hello" data.txt
grep: unrecognized option '--hello'

これは、grepが「–hello」を複数文字のコマンドオプションとして扱うためです。 これを克服するには、ダブルダッシュ(-)を使用する必要があります。 その後に続くものはすべて位置パラメータとして扱われます:

$ grep -- --hello data.txt

3. いつ必要ですか?

オプション以外の引数がハイフンで始まる場合は常にダッシュを使用する必要があります。オプション処理を終了しない場合、コマンドはオプション以外の引数をオプションとして解釈しようとし、失敗する可能性があります。 。

grepにハイフンで始まるパターンを指定するとどうなるかはすでに見てきました。 ただし、これは必ずしも明白ではありません。

パラメータを完全に制御できない場合があります。 たとえば、環境変数を使用してパラメータをコマンドに指定できます。

$ grep $PATTERN data.txt

環境変数PATTERNcontentが”–hello”の場合、 grep コマンドはパターンをコマンドオプションとして扱い、失敗します。 代わりに、二重ダッシュを使用する必要があります。

$ grep -- $PATTERN data.txt

ファイルを削除するときに同様の状況が発生する可能性がありますたとえば、テキストファイルでいっぱいのフォルダがあるとします。 rm とワイルドカードを使用して、それらを削除できます。

$ rm *.txt

ただし、ファイル名のいずれかがハイフンで始まる場合、ファイル名はコマンドオプションとして扱われるため、コマンドは失敗します。 これを解決するには、ダブルダッシュを使用する必要があります。

$ rm -- *.txt

4. すべてのコマンドでサポートされているわけではありません

残念ながら、すべてのコマンドがダブルダッシュ機能をサポートしているわけではありません。

たとえば、 エコー Bashのコマンド。 echoを使用して文字列”-nを出力する場合は、ダブルダッシュを使用してオプション処理を終了してみてください。

$ echo -- "-n"
-- -n

Bashにバンドルされているバージョンのechoも、ダブルダッシュを出力します。 ただし、ダブルダッシュなしでコマンドを実行しようとすると、表示される出力は表示されません。 これは、「-n」が echo末尾の改行文字を出力しないように指示するオプションとして扱われるためです。

5. 結論

このチュートリアルでは、シェルコマンドのダブルダッシュが何をするかを見ました。 必要になる可能性がある場合について説明し、すべてのコマンドがこの機能をサポートしているわけではないことを学びました。