R 从输出文件重定向,以便可以捕获
程序R 从输出文件重定向,以便可以捕获,r,bash,io-redirection,R,Bash,Io Redirection,程序foo写入输出文件,并将诊断信息打印到stdout 因此: 在/out中产生有价值的内容,在日志中产生一些杂乱无章的内容 我需要将/out读入另一个程序(我正在编写的R脚本) 写入文件/out并再次读取的中间步骤很慢,我需要对大型/out文件执行数百次 我想执行某种重定向,以便foo写入文件描述符,而不是可以直接读入脚本的文件/out。但是,stdout已被使用 以下是我尝试过的: 在R中: library(data.table) fread(cmd = "foo -o /dev/
foo
写入输出文件,并将诊断信息打印到stdout
因此:
在/out
中产生有价值的内容,在日志中产生一些杂乱无章的内容
我需要将/out
读入另一个程序(我正在编写的R
脚本)
写入文件/out
并再次读取的中间步骤很慢,我需要对大型/out
文件执行数百次
我想执行某种重定向,以便foo
写入文件描述符,而不是可以直接读入脚本的文件/out
。但是,stdout
已被使用
以下是我尝试过的:
在R
中:
library(data.table)
fread(cmd = "foo -o /dev/stdout -i ./input > /dev/null")
但我有一个错误:
File '/data1/tmp/RtmpkKIpBm/fileeb789130da8e3' has size 0. Returning a NULL data.table.
演示:
说明:
每个进程都有自己的标准输出。使用/foo-o/dev/stdout&>/dev/null
,您告诉foo
将其有价值的信息输出到自己的stdout中,即/dev/null
。但是使用/foo-o>(cat)和>/dev/null
,您告诉foo
将其有价值的信息输出到某个管道中,该管道转到cat
,其标准输出不是/dev/null
,而是从shell继承的
在演示中,shell的stdout是终端,但如果它来自R的fread()
,则shell的stdout和cat的stdout都会转到fread()
可以读取它们的地方。试试看
foo -o /dev/fd/3 -i ./input 3>&1 1>/dev/null
- 在运行命令之前,将处理重定向
- 重定向是从左到右处理的
3>&1
导致写入文件描述符3的任何内容转到当前stdout
1>/dev/null
导致写入stdout
的任何内容转到/dev/null
- 写入
/dev/fd/3
然后写入原始stdout
- 该代码应与任何支持
/dev/fd
目录的系统上的任何符合POSIX的shell一起使用
/dev/fd
目录不是POSIX的一部分,但它在许多类似Unix的系统上都受支持,包括Linux、FreeBSD、macOS和Solaris
您可以在bash中尝试此操作:foo-o>(您的\R\u脚本)-i./input>log
good idea@M.NejatAydin,但我实际上是在R脚本中调用bash命令……我忽略了这一点。我不熟悉R
。是从R
还是从foo
得到的错误?也许您可以在调用foo
时尝试-o-
。在我看来,错误来自于行库(data.table)
foo -o >(cat) -i ./input > log
$ cat foo
#!/bin/bash
if [ "$1" != "-o" ]; then
exit 2
fi
echo "mumbo jumbo stdout" >&1
echo "valueable info" > "$2"
echo "mumbo jumbo stderr" >&2 # threw in stderr for good measure
$ ./foo -o x
mumbo jumbo stdout
mumbo jumbo stderr
$ cat x
valueable info
$ rm x
$ ./foo -o /dev/stdout
mumbo jumbo stdout
valueable info
mumbo jumbo stderr
$ ./foo -o /dev/stdout &>/dev/null
$ ./foo -o >(cat) &>/dev/null
valueable info
foo -o /dev/fd/3 -i ./input 3>&1 1>/dev/null