- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 open( my $command_out, "-|", $command_string )
来执行命令并即时处理其输出(不必先等待命令完成,如 system()
).
我注意到,当我以这种方式调用一些 R 脚本时,一些 R 消息会打印到屏幕上(例如 Loading required package: ...
)。我猜这是因为 R 将此输出发送到 stderr(?尽管这些并不是真正的错误)。
是否可以在 open()
时将此输出也定向到 $command_out
,以便屏幕保持干净?
最佳答案
假设你的 R 程序是
#! /usr/bin/env r
require(Hmisc)
cat(argv[1], "\n")
结果出人意料地健谈:
$ ./prog.r fooLoading required package: HmiscLoading required package: methodsLoading required package: survivalLoading required package: statsLoading required package: utilsLoading required package: graphicsLoading required package: splinesAttaching package: 'Hmisc' The following object(s) are masked from package:survival : untangle.specials The following object(s) are masked from package:base : format.pval, round.POSIXt, trunc.POSIXt, units foo
From here, you could discard the standard error or merge it with another stream.
One way to discard the standard error is to use a shell redirect of 2>/dev/null
. This is a general mechanism, and 2 is the standard error's file descriptor. For example:
#! /usr/bin/perl
use warnings;
use strict;
open my $command_out, "-|", "./prog.r foo 2>/dev/null"
or die "$0: could not start prog.r";
while (<$command_out>) {
print "got: $_";
}
shell 还将处理 backtick or qx//
表达式
#! /usr/bin/perl
use warnings;
use strict;
(my $command_out = `./prog.r foo 2>/dev/null`) =~ s/^/got: /mg;
print $command_out;
和一个标量命令传递给system
#! /usr/bin/perl
use warnings;
use strict;
system("./prog.r foo 2>/dev/null") == 0
or warn "$0: prog.r exited " . ($? >>8);
对于所有这些,输出是
$ ./prog.pl got: foo
But sometimes you don't want the shell putting its grubby mitts on your command. Maybe it contains shell metacharacters or quotes that you don't want to deal with escaping. This is when a safe pipe-open is useful:
#! /usr/bin/perl
use warnings;
use strict;
my $pid = open my $command_out, "-|";
die "$0: fork: $!" unless defined $pid;
if ($pid == 0) {
# child
open STDERR, ">", "/dev/null" or die "$0: open: $!";
exec "./prog.r", "foo & bar" or exit 1; # STDERR silent now
}
while (<$command_out>) {
print "got: $_";
}
close $command_out or warn "$0: prog.r exited " . ($? >> 8);
在 "-|"
上打开句柄会 fork 一个子句柄并将子句柄的标准输出连接到该句柄。喜欢fork
,它向子进程返回 0,向父进程返回一个非零进程标识符,或者在失败时返回未定义的值。
在 child 中,我们首先将STDERR
重定向到/dev/null
,然后使用exec
用我们的 R 程序替换 child 。请注意,我们以列表形式传递命令以绕过 shell:
If there is more than one argument in LIST, or if LIST is an array with more than one value, calls execvp(3) with the arguments in LIST.
因为我们再也看不到标准错误了,所以显式关闭 $command_out
以检查 child 是否愉快地运行很重要。否则,您会遇到令人费解的静默失败。
样本运行:
$ ./prog.pl got: foo & bar
STDERR
into STDOUT
To see the standard error on your handle, use 2>&1
instead, e.g.,
open my $command_out, "-|", "./prog.r foo 2>&1" or die;
通过安全管道打开,dup
标准错误到标准输出:
if ($pid == 0) {
# child
open STDERR, ">&", \*STDOUT or die "$0: open: $!";
exec "./prog.r", "foo & bar" or die "$0: exec: $!";
}
open
文档涵盖了这一点:
You may also, in the Bourne shell tradition, specify an EXPR beginning with
>&
, in which case the rest of the string is interpreted as the name of a filehandle (or file descriptor, if numeric) to be duped (as dup(2)) and opened.
即使您可以通过这种方式看到标准错误,使用close
检查子进程的退出状态仍然是个好主意。
现在一切都通过$command_out
到达:
got: Loading required package: Hmiscgot: Loading required package: methodsgot: Loading required package: survivalgot: Loading required package: statsgot: Loading required package: utilsgot: Loading required package: graphicsgot: Loading required package: splinesgot: got: Attaching package: 'Hmisc'got: got: got: The following object(s) are masked from package:survival :got: got: untangle.specials got: got: got: The following object(s) are masked from package:base :got: got: format.pval,got: round.POSIXt,got: trunc.POSIXt,got: units got: got: foo & bar
关于r - 在 perl 中打开管道时直接使用 STDERR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3486575/
如果我在 C 中调用一个函数并传入一个结构(对那些 C++ 读者来说不是通过指针或引用),它会复制该对象。如果我传入一个包含数组的结构,它会复制该数组(如教授在类里面所说)。但是,如果我传入一个包含对
在 vim 等中,您可以使用 CTRLA 和 CTRLX 增加或减少光标所在的数字。然而,这会增加总数,但我想简单地增加光标正下方的数字。这有点难以描述,所以这就是我的意思: Ctrl+A usage
我正在将 Spring 4.3.2 项目升级到 Spring 5.1.5。我的一个测试用例开始因错误而失败。 ClassNotFoundException: org.hibernate.propert
我想在 Java 中分配一个直接 IntBuffer,比如说 10 亿个元素(64 位系统)。我知道的唯一方法是创建一个直接 ByteBuffer 并将其视为直接 IntBuffer。但是,4*1,0
我正在寻找特定的打印机或某些打印机上存在的技术(接口(interface)、标准、协议(protocol)),这使得可以使用 AJAX 从 Web 浏览器实现直接打印。 这意味着打印机必须: 网络接口
我正在寻求实现删除确认表单的最佳实践建议。 除其他选项外,以下页面包含删除按钮... /website/features/f/123 ...当点击一个简单的表单时,会在以下 url 下加载: /web
我正在使用直接 Web 远程处理库在我的应用程序中执行一些 ajax 调用。我有一个问题,我认为归结为服务调用的延迟响应。以下是我认为有问题的部分代码。问题出在 getDefaultReviewerT
我想替换 Javascript confirm() 函数以允许自定义按钮而不是 Yes/Cancel。我尝试搜索,但所有解决方案都是事件驱动的,例如 jquery 对话框(代码不等待响应但它是事件驱动
我知道有几个类似的问题,但是,其中的示例并没有说明问题,或者我无法从中获利 - 我真可耻。 所以我的问题是在带有 GUI 的简单应用程序中加载图像。例如: 我在 "D:\javaeclipseprog
我想用不同的颜色为表格的行着色,所以我正在使用它 table#news tr:nth-child(even) { background-color: red; } table#news
下面的测试代码不起作用 from("direct:start").setExchangePattern(ExchangePattern.InOnly).threads(5).delay(2000).b
我在 python 中实现的第一个项目之一是对棒渗流进行蒙特卡罗模拟。代码不断增长。第一部分是棍子渗滤的可视化。在宽度*长度的区域中,使用随机起始坐标和方向绘制具有一定长度的直棒的定义密度(棒/面积)
跟踪直接文件下载的最佳方法是什么?我找到了一些解决方案,例如这个: http://www.gayadesign.com/diy/download-counter-in-php-using-htacce
我在一个线程中有一个直接的 ByteBuffer(堆外),并使用 JMM 给我的一种机制将它安全地发布到另一个线程。 happens-before 关系是否扩展到由 ByteBuffer 包装的 na
当我测试直接 java.nio.ByteBuffer 的读取性能时,我注意到绝对读取平均比相对读取快 2 倍。此外,如果我比较相对读取与绝对读取的源代码,除了相对读取维护和内部计数器外,代码几乎相同。
我知道这个问题已经被问了无数次,并且在很多情况下都得到了答案。我相信我已经阅读了其中的大部分内容。不幸的是,我在这上面能找到的一切 简单说明 ElementRef.nativeElement不好,不要
回到一些 C 语言工作。 我的许多函数看起来像这样: int err = do_something(arg1, arg2, arg3, &result); 根据意图,结果由函数填充,返回值是调用的状态
当我将 XML 提交到 https://secure-test.WorldPay.com/jsp/merchant/xml/paymentService.jsp 时: Personalised
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我的 Angular 路由行为有问题。刷新或输入的 url 像/user 总是将我重定向到/home。我还在 index.html 文件中设置了 。通过单击导航菜单按钮一切正常。但是一旦我尝试刷新页面
我是一名优秀的程序员,十分优秀!