我想测试我的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的解决方案。
答案 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)。