コマンドの最後のダッシュ「-」はどういう意味ですか?


78

次のコマンドを考えます:

gzip -dc /cdrom/cdrom0/file.tar.gz | tar xvf 

何をしない-コマンドの終わりには、どういう意味ですか?何らかのプレースホルダーですか?


3
言及-すべき小さな詳細:コマンドの最後にある必要はありません。例:ls -l | diff - /old_ls_output.txt
マナトワーク

回答:


82

この場合、「標準入力」を意味します。tarファイル引数が必要で、代わりにstdinを使用する必要がある場合、一部のソフトウェア(例)で使用されます。これはシェル構造ではなく、使用しているプログラムによって異なります。疑問がある場合は、マンページを確認してください!

この場合、標準入力は-fオプションの引数です。-がサポートされていない場合は、tar xvf /proc/self/fd/0またはのようなものを使用tar xvf /dev/stdinして回避できます(後者はさまざまな大学で広くサポートされています)。

「標準入力」を一般的に意味するためにこれに依存しないでください。それはシェルによって解釈されないため、すべてのプログラムは自由に処理できます。場合によっては、それは標準出力またはまったく異なるものです:suそれは「ログインシェルを開始する」ことを意味します。それ以外の場合は、まったく解釈されません。マッスルメモリを-使用すると、以前使用したプログラムのバージョンがダッシュを理解できなかったため、かなり多くのファイルが作成されました。


4
STDOUTコンテキストに応じて、を意味することもあります。
バハマ

3
そして、それは解釈する個々のプログラム次第であるので、ほとんど何でも。
アレクシオス

5
/dev/stdinまたは/dev/stdout、本当に入出力ストリームが必要な場合に使用できます。これはストリームであることに注意してください。ファイルをシークしたいプログラムは、-(たとえばffmpeg)
-Lekensteyn

3
の場合bash、ハイフンシェルによって解釈されます。Advanced Bash-Scripting Guide-Chapter 3. Special Charactersを参照して、テキスト[dash]または「redirect from / to stdin or stdout」を検索してください。を使用bashすると、ファイル名を期待するほとんどの場所でハイフンを使用できます。<|を補完するものです。>私見
-bsd

4
私はそうだと確信していません。まず、catハンドル-(マンページを確認)。シェル組み込みバージョンのcat場合はそうかもしれませんが、それは厳密にはシェル全体ではありません。また、シェルがを処理した場合、-echo -と言うことができ、他の何かに展開されます。代わりに、ダッシュをエコーし​​ます(/dev/stdinまたはではありません/proc/self/fd/0)。とecho test > -呼ばれるファイルを作成するだけな-ので、明らかにそこでも処理されません。ああ、そしてあなたがリストしたページは、それがシェルによって処理されているとは言っていません。catそしてdiff、あなたはそれをand とともに使用できると言っています。どちらも明示的にダッシュを理解します。
Alexios

13

この場合、-Linuxを実行していると仮定すると、実際にはかなり役に立ちません:

GNU tar(Linux上のバージョン)は、デフォルトで標準入力からの入力を受け入れます。あなたがない場合ではない、この動作をしたい、とコマンドライン引数としてファイル名を渡したい、あなたはフラグを指定する必要がありますf

tar xf filename

これは次と同じです

tar x < filename

または、入力が例のようにgzip圧縮されている場合:

gzip -dc filename | tar x

fここでフラグを指定することは意味がありませんが、指定されているため-、標準入力から読み取ることを示すためにファイル名を指定する必要があります(他の回答を参照)。繰り返しますが、これは冗長であり、少し奇妙です。

さらに、フラグをgzip指定することにより、GNU tarがそれ自体を通して入力をストリーミングするように指示できるため、上記の行を単純化できますz

tar xfz filename

gzip明示的に呼び出す必要はありません。


1
注:すべてtarzオプションがあるわけではありません。
リオリ

2
Linux以外のほとんどのOS tarは、歴史的な理由により、デフォルトで最初のテープドライブを使用しています。
ジル

1
@Gilles BSD、および OS X、…。しかし、私は好奇心が強いです:いくつかの古いメインフレームを除く他のどのシステムがまだそのようなバージョンを使用していますか(メインフレーム以外のシステムにはテープドライブさえあります)?
コンラッドルドルフ

1
@KonradRudolph 3つの主要なBSDすべてがデフォルトでテープドライブ/dev/sa0になっています(FreeBSD 9.0、/dev/rst0NetBSD 6.0、およびOpenBSD 5.1)。AIX 7.1のデフォルトは/dev/rmt0です。MINIX3のデフォルトは/dev/sa0です。(それぞれ最新のOSバージョンをチェックしましたが、これらは「古いメインフレーム」ではありません。)Solarisは、のファイルを使用して構成できます。/etcデフォルトはテープドライブです。GNU tar、シリングtar、OSX、およびBusyBoxのデフォルトはstdin / stdoutです。
ジル

1
@Gilles- 明らかな理由から、tarデフォルトで2番目のテープドライブに再コンパイルしました。:)
デビッドハークネス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.