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


110

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

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

    echo hello > -

    -この例でどのようにSTDOUTを意味させることができますか?

  2. 逆に、次のような例で-名前が付けられたファイルをどのように意味することができますか?-

    cat -

3
直接コメントするには50の評判が必要なようです... / dev / stdin / dev / stdoutコメントでは、正当なUNIX派生物であるAIXにはこれらの擬似デバイスがありません。また、さらなるコメントとして、LINUXはUNIXの派生物ではありません。これはPOSIX準拠のワーカライクであり、この時点で最もUNIXに似たOSの中で最も人気がありますが、間違いはありません。これはUNIXではありません。しかし、ここでの返信の要旨は正しいです。「-」表記はシェルによって特別なものとして解釈されないため、ARGとして個々のアプリケーションに直接渡されます。アプリケーションはrecogniしない場合

2>&-「記述子2を閉じる」という意味の構造もあります。
user3132194 16

@ user95873、あなたが言いたいと思うのは、LinuxはUnixに似ていますが、すべてのUnixに似ている(または真のUNIX)がLinuxであるとは限りません。Linuxが真であるかそうでないかは、UNIX(つまり、Single UNIX Specificationに準拠)に/ dev / std {in、out、err}の問題とは関係ありません。/ dev / std {in、out、err}は追加された機能であり、欠落していません。
サーシャ

回答:


156

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

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

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


37
それはそれを追加する価値がある/dev/stdin/dev/stdout普遍的に利用可能であり、の代わりに使用することができる-大会。
jmtd

また、このcat場合、引数をリストする代わりにリダイレクトを使用すると役立つ場合がありますcat <-。ただし、一度に複数のファイルを連結する場合、それを組み合わせて一致させることは困難です。
jmtd

10
@jmtd:/ dev / std {in、out}は普遍的に利用できるわけではありません。すべてのUNIXにあるわけではありません。
CAMH

2
興味深いことに、私はそれらがPOSIXの一部であると仮定しました(しかし、確認できません)。少なくともLinux、BSD、およびSolarisに存在します。それらを欠く最新のUNIXの例を挙げていただけますか?
jmtd

1
@camh通知を受け取ったかどうかはわかりませんが、これは非常に古いトピックです。できるかどうかはわかりませんが、の質問へjmtdの答えを知っている場合、私は非常に興味がありますか?:)
スイベル

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

    しばらく「 - 」、それをサポートしたい各プログラムによって実現する必要がある大会で/dev/stdin/dev/stdout/dev/stderrされている、OSでサポートされているとき(少なくともSolaris版、LinuxやBSD系が行う)、アプリケーションから独立した後、あなたのように動作します意図する。


9

以下のように述べたCAMH-単にいくつかのプログラムで使用される命名規則です。シェルが認識するファイル記述子でこれらのストリームを参照したい場合、jiliagreは名前を使用する/dev/stdinか、/dev/stdout代わりに使用することで正しいです。これらのファイル名は、通常のファイル名が機能する任意の場所で機能するはずです。

  1. そうは言っても、最初の例はちょっと馬鹿げています。ファイルに書き込むためにリダイレクト演算子によってキャッチされる出力は、すでに標準出力がオンになっているため、リダイレクトして元の場所に書き戻すことは無意味です。そこで使用する動作は、リダイレクトではなくパイプです。

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

    cat ./-

6

1に関しては、プログラムはそれをサポートしなければなりません。任意に使用することはできません。2については、入力をリダイレクトします(例:)cat < -


1

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

最善の方法は次のとおりです。

$ echo hello > /dev/fd/1

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


リダイレクトは、呼び出されるプログラムではなく、シェルによって解釈されます。
sherrellbc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.