Perl:检查shell是否重定向文件句柄

时间:2013-07-12 13:54:40

标签: perl shell file-io file-descriptor

我想测试我的perl程序是否被调用为:

my_program.pl 3>&1
my_program.pl 3>/tmp/file
my_program.pl 21>my.fifo

或:

my_program.pl

所以我需要在perl中使用一种方法来测试shell是否打开了按编号的文件描述符。

背景

这是GNU Parallel的可能扩展。目前GNU Parallel只确保STDOUT和STDERR不混合,​​因此这将混淆输出:

parallel 'echo begin {} >&3; sleep 1; echo end >&3' ::: a b c 3>/tmp/file

虽然这不会因为STRER被GNU Parallel缓冲:

parallel 'echo begin {} >&2; sleep 1; echo end >&2' ::: a b c 2>/tmp/file

现在不需要在未打开的文件句柄上花费资源。这将失败:

parallel 'echo begin {} >&3; sleep 1; echo end >&3' ::: a b c

因此GNU Parallel应该只缓冲文件描述符3,如果它实际上是在GNU Parallel之外重定向的话。但我不知道在Perl中检测它的方法。

在GNU / Linux上,我可以转到/ proc / $$ / fd并查看打开的描述符,但我更喜欢不依赖于/ proc / * / fd的解决方案。

1 个答案:

答案 0 :(得分:1)

事实证明这很简单:只需打开filedescriptor的文件句柄即可。如果失败,则不会打开filedescriptor:

perl -e 'for (1..1000) { my $fh; if(open($fh,">&=$_")) {$fh{$_}=$fh }  } print map{"$_\n"} keys %fh'  3>/tmp/foo

小问题是bash使用fd 62及以上的<(cmd)。

相关问题