web-dev-qa-db-ja.com

ファイル名の代わりにダッシュ(-)を使用する

コマンドの場合、ファイル名の代わりに引数として-を使用すると、STDINまたはSTDOUTを意味します。

  1. ただし、この例では、-という名前のファイルを作成します。

    echo hello > -
    

    この例の-をSTDOUTにするにはどうすればよいですか?

  2. 逆に、次のような例で--という名前のファイルを意味するようにするにはどうすればよいですか。

    cat -
    
121
Tim

Stdin/stdoutを意味するファイル名として-を使用することは、多くのプログラムが使用する規則です。これはファイル名の特別なプロパティではありません。カーネルは-を特別なものとして認識しないため、-をファイル名として参照するシステムコールでは、-をファイル名として文字どおり使用します。

Bashリダイレクトでは、-は特別なファイル名として認識されないため、bashはそれをリテラルファイル名として使用します。

catが文字列-をファイル名として認識すると、それをstdinの同義語として扱います。これを回避するには、catが参照する文字列を、-というファイルを参照するように変更する必要があります。これを行う通常の方法は、ファイル名の前にパス-./-、または/home/Tim/-を付けることです。この手法は、コマンドラインオプションがファイル名と競合する同様の問題を回避するためにも使用されるため、./-eと呼ばれるファイルは、プログラムの-eコマンドラインオプションとして表示されません。

169
camh
  1. echo hello > -の代わりに、echo hello > /dev/stdoutを使用できます。

    「-」は、サポートしたい各プログラムで実装する必要がある規則ですが、/dev/stdin/dev/stdout/dev/stderrは、OS(少なくともSolaris、LinuxおよびBSDは、アプリケーションに依存せず、意図したとおりに機能します。

18
jlliagre

camh言及-は、一部のプログラムで使用される命名規則にすぎません。シェルが認識するファイル記述子を使用してこれらのストリームを参照する場合は、_ jiliagreは正しい を使用して/dev/stdinまたは/dev/stdout代わりに。これらのファイル名は、通常のファイル名が機能する場所ならどこでも機能するはずです。

  1. そうは言っても、最初の例はちょっとばかげています。リダイレクトオペレーターがファイルに書き込むためにキャッチする出力は、すでに標準出力になっているため、リダイレクトして元の場所に書き戻すことはできません。そこで使用する動作は、リダイレクトではなくパイプです。

    echo hello |
    
  2. 2番目の例では、内部エイリアスではなく、その名前のリテラルファイルが必要であることを示す必要があるだけです。次のようにファイルへのパスを指定することにより、これを最も簡単に行うことができます。

    cat ./-
    
10
Caleb

1に関しては、プログラムはそれをサポートする必要があります。勝手に使うことはできません。 2に関しては、入力をリダイレクトします(例:cat < -)。

6
bahamat

「-」アプローチには多くの問題があります。まず、「-」文字の解釈が必要であり、多くのプログラムはそのような解釈を実行しません。さらに、ハイフンをコマンドラインオプションの終わりを示す区切り文字として解釈するプログラムもあります。プログラムはファイル名引数で動作するように作成されています。「-」アプローチはハックです。ニースですが弱いです。

最善の方法は:

$ echo hello > /dev/fd/1

/dev/stdout/dev/fd/1のシンボリックリンクです

1
b3h3m0th

特殊文字には、主に2つの意味があります。

ASCII数値チャート。

スクリプトまたはシンボリック。

単一の文字が文字列を表すか、文字列として機能する可能性があります。私の理解として。

c言語ではfopen()関数は、最初のファイルストリームと、ファイルを開く2番目のモードの2つの引数を取ります。モードは文字列です。単一の文字であっても。

cat> "-"が機能します。

0
Owais Qureshi