1. 概要

このチュートリアルでは、「-」文字とは何か、そしてそれがどのような目的を果たしているかを見ていきます。 「-」の使用が代替アプローチよりも理にかなっている最も一般的なユースケースを見ていきます。

2. 「-」文字の意味

「-」文字は、Linuxターミナルのコマンドごとに異なることを意味します。 Linuxコマンドで「-」文字を使用するための普遍的な規則はありません。 ただし、次のような最も一般的に使用されるシェルでは bash zsh 、「-」文字は、コマンドの標準入力または標準出力を指定するために使用されます。 これは、多くのLinuxユーティリティのコマンド固有の規則です。

一方、Linux上の他のツールやコマンドでは、「-」文字の使用例が異なる場合があります。たとえば、gitコマンドで「-」を使用します。リポジトリブランチを指定します。 tar のように、ファイルを入力として期待する他のツールの場合、「-」文字は、別のコマンドの出力を入力ファイルの内容として扱うために使用されます。 したがって、コマンドへのファイルパスを指定する必要はありません。

3. 「-」を使用して標準入力を指定する

Linuxのほとんどのコマンドは、文字列「-」をstdinまたはstdoutの同義語として扱います。 したがって、たとえば、 cat コマンドを裸の「-」で使用すると、stdinから読み取られます。

$ cat -
I am being echoed.
I am being echoed.

上記のコマンドの「-」は、実際には / dev / stdin のエイリアスです。したがって、「-」を/ dev / stdinに置き換えることもでき、何も変更されません。[X159X ]

$ cat /dev/stdin
Echo this.
Echo this.

それで、それは疑問を投げかけます、 / dev / stdin とは何ですか? / dev/stdinは/proc/ self / fd/0へのシンボリックリンクです。 / proc / self / fd / 0は、ターミナルである現在のシェルプロセスの標準入力へのシンボリックリンクです。 。 そのため、端末を使用してcatコマンドにテキストを入力することができます。

同様に、 tar コマンドを使用して、tarballを抽出し、stdoutに出力できます。 stdout に出力されたtarballの内容は、 tar コマンドへの入力として機能します。このコマンドは、次のスニペットに示すように、内容を解凍してディスクに書き込みます。

$ <htop-2.2.0.tar.gz | tar -xzf -

それを分解しましょう:

  • 内容を印刷します htop-2.2.0.tar.gz にアーカイブ stdout リダイレクト演算子を使用する <
  • 次に、コマンドを tar にパイプします。これにより、stdoutからhtop-2.2.0.tar.gzの内容が読み取られます。
  • -x オプションは、ファイル、またはこの場合はstdoutの内容を抽出します
  • -z オプションは、gzipを介してコンテンツをフィルタリングします
  • -f オプションは、抽出されたコンテンツをファイルまたはディレクトリに書き込みます

tar を「-」とともに使用するもう1つの実用的な使用例は、リモートファイルをダウンロードし、ダウンロード後に解凍する場合です。 curl を使用して、ダウンロードしたファイルのテキストまたはバイナリ出力をstdoutに出力できます。 次に、stdoutに出力されたものをtarにパイプし、stdoutの内容をstdinとして指定できます。

$ curl -L https://github.com/hishamhm/htop/archive/refs/tags/2.2.0.tar.gz --output - | tar zxf -
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   130  100   130    0     0    135      0 --:--:-- --:--:-- --:--:--   135
100  168k    0  168k    0     0  77436      0 --:--:--  0:00:02 --:--:--  309k
$ ls -lF
drwxr-xr-x hey hey 4.0 KB Wed Dec 1 22:41:43 2021 htop-2.2.0/

4. 「-」を使用して標準出力を指定する

同様に、「-」を使用して特定のコマンドの標準出力を指定することもできます。 curl の例では、「-」を使用して、リモートファイルのバイナリ出力を標準出力に出力しました。

$ curl -L https://github.com/hishamhm/htop/archive/refs/tags/2.2.0.tar.gz --output -
E�P��7�&�3Dq�"!GKvL�[f>׫��GY6as<Hl�'�)2'AS�*��~맊VT#a;�}x܍ҋ�zN
�8YWslw>���bmLf-~r+�����ju��WTr
��υ<��u�kIM�wy֌fٚ9~a9
...

ご覧のとおり、デフォルトではcurlはバイナリコンテンツをstdoutに出力しないため、curlコマンドにバイナリファイルのコンテンツを出力するように明示的に指示しました。 。 stdinと同様に、stdoutのコンテキストで「-」が使用されている場合、これは/ dev/stdoutのエイリアスです。

したがって、なぜバイナリ出力を標準出力に出力するのか不思議に思うかもしれません。 さて、私たちはそれを使って多くの有用なタスクを行うことができます。 次の例では、基本的に curl を使用して画像をダウンロードし、ImageMagickを使用して画像からファビコンを作成するコマンドを記述します。 画像のサイズが変更されたら、それをbase64に変換し、結果をエンドポイントにPOSTします。 これらすべてのタスクは、stdinおよびstdoutの読み取りと書き込みによってのみ実行され、内容をディスク上のファイルに保存する必要はありません。

$ curl https://upload.wikimedia.org/wikipedia/commons/4/45/Linux-for-workgroups-boot.jpg --output - \
| convert - -resize 16x16 png:- \
| base64\
| curl -X POST --data @- -H 'Content-Type: text/plain' https://example.com/favicon

それを分解しましょう:

  • 最初のコマンドでは、 –output – オプションを使用して、画像をダウンロードし、そのバイナリコンテンツをstdoutに出力します。
  • 次に、コンテンツを convert コマンドにパイプします。このコマンドは、 stdout から読み取り、画像のサイズを変更します。
  • 画像のサイズが変更されると、サイズ変更された画像のPNGコンテンツがpngで示されるようにstdoutに出力されます。-
  • その後、コンテンツは base64 コマンドにパイプされ、サイズ変更されたファビコンのbase64コンテンツが出力されます。
  • 最後に、 curl は、 –data @-オプションで示されるように、標準出力から選択されたデータを使用して、サンプルエンドポイントにポストリクエストを行います。

ご覧のとおり、stdinstdoutの両方に「-」を使用しました。 それに応じてそれを解釈するのはコマンド自体次第です。 もちろん、「-」を/ dev/stdinと/dev/ stdoutに置き換えることができ、結果は同じになります。

5. Gitブランチに「-」を使用する

ご存知のように、「-」はコマンドごとに異なることを意味します。 gitの場合、git checkoutコマンドの引数として使用して、前のアクティブなブランチまたはデタッチされたHEADをチェックアウトできます。たとえば、Gitリポジトリとリポジトリに2つのブランチがある場合、「-」を使用して、これら2つのブランチを切り替えることができます。

$ git branch -a
*master
dev
$ git checkout dev
$ git branch -a
master
*dev
$ git checkout -
$ git branch -a
*master
dev

6. cdコマンドで「-」を使用する

同様に、 git コマンドと同様に、 cdコマンドの引数として「-」を使用して、現在のディレクトリと前のディレクトリを切り替えることもできます。

実際の動作を見てみましょう。

$ pwd
/home/hey/github
$ cd TestApp
$ pwd
/home/hey/github/TestApp
$ cd -
$ pwd
/home/hey/github
$ cd -
$ pwd
/home/hey/github/TestApp

このシェルは、古いパスを $OLDPWDという環境変数に格納します。 したがって、「-」パラメータは $OLDPWDのエイリアスとして機能します。

$ echo $OLDPWD
/home/hey/github/TestApp
$ cd $OLDPWD
$ pwd
/home/hey/github/TestApp
$ echo $OLDPWD
/home/hey/github

7. 他にどこで「-」を使用できますか?

これまで見てきたように、「-」パラメータを解釈するのは各ツールまたはコマンド次第です。 ただし、他の多くのツールは、さまざまな目的で「-」パラメーターを使用します。 ツールが「-」パラメータをサポートしているかどうかを確認するための最も一般的で信頼性の高い方法は、公式のマンページを確認することです。

8. 結論

この記事では、Linuxコマンドラインで「-」を使用する意味と、最も一般的なコマンドによってどのように解釈されるかについて説明しました。 また、「-」を使用して stdin から読み取り、stdoutに書き込むことができるいくつかのユースケースも確認しました。

最後に、gitおよびcdコマンドで「-」を使用する方法を確認しました。