perl - 在 csh 中重定向 stderr 时出现问题

标签 perl shell redirect csh tcsh

我正在编写一个应该在 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/

相关文章:

javascript - 使用react-router-dom v6提交表单后如何重定向到另一个页面并传递数据?

php - PHP 回显的 Javascript 不运行

perl - Perl 有运行时流程图吗?

python - 我怎样才能知道 os.popen 是否在同一个 shell 中运行 linux 命令?

linux - 允许在 rbash 中完成制表符

shell - shell heredocs 中的 <EOF 和 <'EOF' 有什么区别?

bash - 在包装 bash 脚本中设置管道

perl - 如何从我的 perl 脚本非阻塞地写入 gzip 文件?

multithreading - 如何在Perl中控制多线程同步

perl - “子程序条目中的宽字符”- UTF-8 编码的西里尔字母作为字节序列