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