コマンドの場合、-
ファイル名の代わりに引数として使用される場合、STDIN または STDOUT を表します。
ただし、この例では次のファイルが生成されます
-
。echo hello > -
-
この例では、STDOUTをどのように表現できますか?代わりに、次のように例
-
で指定されたファイルをわかりやすくするにはどうすればよいですか?-
cat -
答え1
stdin / stdoutを表すためにファイル名を使用することは、-
多くのプログラムで使用される規則です。これはファイル名の特別な属性ではありません。これはカーネルでは特別とは見なされないため、ファイル名を参照するすべてのシステムコールは-
ファイル名を文字通り使用します。-
-
Bashリダイレクトを使用すると、-
これは特殊ファイル名として認識されないため、Bashはそれをリテラルファイル名として使用します。
cat
文字列がファイル名として扱われると、-
stdinの同義語として扱われます。この問題を解決するには、cat
表示される文字列がまだファイル名を参照するように変更する必要があります-
。これを行う一般的な方法は、ファイル名の前にパスを追加することです./-
。/home/Tim/-
この手法は、コマンドラインで同様の問題を解決するためにも使用されます。オプションがファイル名と競合します。たとえば、というファイルはプログラムのコマンドラインオプション./-e
として表示されません。-e
>& filename
1 bashが最終的にcshからコピーしてstdoutとstderrをリダイレクトする演算子を除いて、>&-
ファイル記述子はまだBourneシェルのように閉じられており、-
引用または拡張されても結果は>&
この演算子を任意のファイル名に使用できないことを意味しますします。標準/Bourne> "$file" 2>&1
構文またはbash関連構文を使用してください&> "$file"
。
答え2
代わりに
echo hello > -
使用できますecho hello > /dev/stdout
。「-」は、それをサポートするすべてのプログラムが実装する必要がある規則ですが、オペレーティングシステムが
/dev/stdin
それをサポートしている場合(少なくともSolaris、Linux、およびBSD)、、およびはアプリケーションに依存しませ/dev/stdout
ん/dev/stderr
。
答え3
〜のようにカムが言及されているは、-
一部のプログラムで使用される命名規則にすぎません。シェルが認識するファイル記述子を使用してこれらのストリームを参照するには、ジリアングレーが正しい/dev/stdin
その名前を使用するか、代わりに使用してください/dev/stdout
。これらのファイル名は、一般的なファイル名が利用可能なすべての場所で機能する必要があります。
つまり、最初の例は少し愚かです。リダイレクト演算子がキャプチャしてファイルに書き込んだすべての出力は既に標準出力であるため、リダイレクトして元の場所に書き換えるのは役に立ちません。ここで使用する動作はリダイレクトではなくパイピングです。
echo hello |
2番目の例では、内部エイリアスではなく、その名前のジャンクファイルが必要なことを示しています。次のようにファイルパスを指定すると、最も簡単にこれを行うことができます。
cat ./-
答え4
「-」メソッドには多くの問題があります。まず、多くのプログラムで実行されていない「-」文字の解釈が必要です。また、一部のプログラムでは、ハイフンをコマンドラインオプションの終わりを示す区切り文字として解釈します。このプログラムはファイル名引数で動作するように書かれており、「-」メソッドはハッキングですが、優れていますが弱いです。
最良の方法は次のとおりです。
$ echo hello > /dev/fd/1
/dev/stdout
シンボリックリンクです/dev/fd/1