/dev/stdout
ファイル名を渡して、ファイルが標準出力にパイプされることを期待するコマンドラインユーティリティをだますことが多いことがわかります。
stdout
/代わりに、番号付きのファイル記述子にパイプするようにツールを設定できるかどうか疑問に思います。代わりにstderr
パイプするには、次のことができます。stderr
stdout
command 2>&1 >/dev/null | grep 'something'
私の質問をより具体的にするには(最小再現可能な例):パイピングのために(特定のツールについて尋ねるものではありません。どんなアイデアもあるようです)、代わりにファイル記述子/dev/stdout
番号3で出力が終わるようにここで何を変更する必要がありますか?stdout
使用できるので、文字列をfd 3に追加します/dev/stdout
。
cp a /dev/stdout
cp
通常、ファイルパスが必要なコマンドに置き換えられました。
効果的ですか/dev/3
?/dev/stdout
fd 1の代わりにfd 3のアナログを探しています。
質問を別の方法で置き換えるには:
file descriptor 1 is to /dev/stdout
what
file descriptor 3 is to ???
代わりにここで何を使うべきですか????
私は広く検索しましたが、何も見つかりませんでした。
答え1
多くのシステム(すべてではありません!)では、/dev/fd/
これはファイルハンドルのディレクトリです。 Linuxでは通常はへのリンクですが、/proc/self/fd
NetBSD9(たとえば)では実際のディレクトリです。
だから
% ( cat a > /dev/fd/9) 9>&1 >/dev/null | grep .
foo
しかし、cp
使用するシェルによって異なります。
ksh93を使用するCentOS7で...
% cp a /dev/fd/9 9>&1 >/dev/null | cat
cp: cannot create regular file '/dev/fd/9': No such device or address
/dev/fd/9
これは通常のファイルではないからです。しかし〜〜に応じてbash
...
$ cp a /dev/fd/9 9>&1 >/dev/null | cat
foo
効率的!
ご覧のとおり、これはすべてのプラットフォームに存在することは保証されておらず、同じプラットフォームのシェル間でも移植可能ではありません!
答え2
私が知っている限り、すべてのシステムに適用されるわけではありません。しかし、DebianとすべてのGnu / Linuxでは
/dev/stdout
へのシンボリックリンクです/proc/self/fd/1
。ディレクトリを見て、/proc/self/fd/
他のファイル記述子を見つけることができます。これには、使用中のファイル記述子のみが含まれます。これはプロセスによって異なります。
答え3
努力する/proc/self/fd/«number»
実際にプロセスIDの名前を指定すると、この方法ですべてのプロセスファイルにアクセスできます。
これはオペレーティングシステムによって異なり、すべてのUnixで動作しない可能性があります。