我正在编写一个应该在 shell 中执行命令并解析其输出的 Perl 脚本。作为 shell,我打算使用 csh。我已经开始了
my $out = `cmd`
但它没有捕获我也需要的 STDERR。使用输出重定向运行 sh 什么都不做
my $out = `sh -c "cmd 2>&1"`
仍然只捕获 STDOUT,不捕获 STDERR。
即使重定向到 csh 中的文件对我来说也不起作用
tcsh$ cmd >& logfile.log
仍然只捕获 STDOUT %)
我尝试执行的命令实际上是 sh 脚本,此脚本中的一些命令打印到 STDERR 中,我想捕获该输出。如果我执行 sh -c "cmd 2>/dev/null"
STDERR 实际上转到/dev/null 并且只有 STDOUT 打印在终端中。
谁能帮我解决这个问题?
最佳答案
我相信您没有告诉我们一些事情。你在cygwin上吗?还是 window ?您是否设置了 PERL5SHELL
环境变量?
有些事情您没有告诉我们,因为这两个平台在我可以轻松测试的五个平台上都运行良好:
% perl -le '$out = `sh -c "grep missing /dev/nowhere 2>&1" | cat -n`; chomp $out; print "got <<<$out>>>"'
got <<< 1 grep: /dev/nowhere: No such file or directory>>>
但到目前为止,没有理由显式地调用 sh(1) 来进行 shelling out。这是因为 Perl 总是 为所有反引号、管道打开和 system()
shell-out 调用 sh(1):
% perl -le '$out = `grep missing /dev/nowhere 2>&1 | cat -n`; chomp $out; print "got <<<$out>>>"'
got <<< 1 grep: /dev/nowhere: No such file or directory>>>
我能想到的唯一异常(exception)发生在非 Unix 系统上,因为它们没有 /bin/sh,所以定义了其他东西。
但在任何情况下,简单的 shell-outs 都不会在你背后调用 tcsh(1)。您必须认真破解 perl(1) 源代码才能实现这一点。我也很怀疑你能否(轻松地)破解二进制文件,因为字符串 "/bin/tcsh"
将比 "/bin/sh"
长,并且无论如何,它不会经常在 /bin/ 中找到。
即使从 shell 也无法使 stderr 重定向正常工作,这表明发生了一些非常奇怪的事情。我认为我们需要更多信息。
关于perl - 在 csh 中重定向 stderr 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5713909/