コマンドの場合-
、ファイル名の代わりに引数として使用すると、STDINまたはSTDOUTを意味します。
ただし、この例では、次の名前のファイルを作成します
-
。echo hello > -
-
この例でどのようにSTDOUTを意味させることができますか?逆に、次のような例で
-
名前が付けられたファイルをどのように意味することができますか?-
cat -
2>&-
「記述子2を閉じる」という意味の構造もあります。
コマンドの場合-
、ファイル名の代わりに引数として使用すると、STDINまたはSTDOUTを意味します。
ただし、この例では、次の名前のファイルを作成します-
。
echo hello > -
-
この例でどのようにSTDOUTを意味させることができますか?
逆に、次のような例で-
名前が付けられたファイルをどのように意味することができますか?-
cat -
2>&-
「記述子2を閉じる」という意味の構造もあります。
回答:
-
stdin / stdoutを意味するファイル名として使用することは、多くのプログラムが使用する規則です。ファイル名の特別なプロパティではありません。カーネルは-
特別なものとして認識しないため-
、ファイル名として参照するシステムコールは、ファイル名-
として文字通り使用します。
bashリダイレクトで-
は、は特別なファイル名として認識されないため、bashはそれをリテラルファイル名として使用します。
ときにcat
文字列を見て-
、ファイル名として、それが標準入力の同義語として扱われます。これを回避するには、表示される文字列cat
を、というファイルを引き続き参照するように変更する必要があります-
。これを行う通常の方法は、ファイル名の前にパスを付けることです- ./-
または/home/Tim/-
。この手法は、コマンドラインオプションがファイル名と競合する同様の問題を回避するためにも使用されるため、たとえば、参照されるファイルはプログラムのコマンドラインオプション./-e
として表示されません-e
。
/dev/stdin
と/dev/stdout
普遍的に利用可能であり、の代わりに使用することができる-
大会。
cat
場合、引数をリストする代わりにリダイレクトを使用すると役立つ場合がありますcat <-
。ただし、一度に複数のファイルを連結する場合、それを組み合わせて一致させることは困難です。
jmtd
の答えを知っている場合、私は非常に興味がありますか?:)
以下のように述べたCAMH、-
単にいくつかのプログラムで使用される命名規則です。シェルが認識するファイル記述子でこれらのストリームを参照したい場合、jiliagreは名前を使用する/dev/stdin
か、/dev/stdout
代わりに使用することで正しいです。これらのファイル名は、通常のファイル名が機能する任意の場所で機能するはずです。
そうは言っても、最初の例はちょっと馬鹿げています。ファイルに書き込むためにリダイレクト演算子によってキャッチされる出力は、すでに標準出力がオンになっているため、リダイレクトして元の場所に書き戻すことは無意味です。そこで使用する動作は、リダイレクトではなくパイプです。
echo hello |
2番目の例では、内部エイリアスではなく、その名前のリターラルファイルが必要であることを示す必要があります。次のようにファイルへのパスを指定することで、これを最も簡単に行うことができます。
cat ./-
「-」アプローチには多くの問題があります。まず第一に、「-」文字の解釈が必要であり、多くのプログラムはそのような解釈を実行しません。さらに、ハイフンをコマンドラインオプションの終わりを示す区切り文字として解釈するプログラムもあります。プログラムはファイル名の引数で動作するように書かれており、「-」アプローチはハックですが、素晴らしいですが、弱いです。
最善の方法は次のとおりです。
$ echo hello > /dev/fd/1
/dev/stdout
のシンボリックリンクです /dev/fd/1