作者:红烧大青虫 | 来源:互联网 | 2023-05-19 05:27
我写了一个小的R脚本来读取JSON,它可以很好地工作但是在管道上
Rscript myscript.R | head
(完整的,预期的)输出返回错误
Error: ignoring SIGPIPE signal
Execution halted
奇怪的是我无法通过管道STDERR来删除它/dev/null
:
Rscript myscript.R | head 2>/dev/null
给出了同样的错误...大概是因为Rscript命令中出现了错误?对我的建议是head命令的输出都是STDOUT.
管道STDOUT /dev/null
仅返回错误消息
管道STDERR /dev/null
只返回错误消息......!
将输出管道输入cat似乎是"不可见的" - 这不会导致错误.
Rscript myscript.R | cat | head
在cat命令之后可以进一步进行管道链接,但感觉我可能忽略了一些不重要的事情,因为它没有解决错误.
我是否需要在脚本中使用设置以允许没有错误的管道?我希望R脚本可以像Python和Perl那样为小任务做好准备,并且总是不得不添加无用的东西cat
.
有处理用C这个错误的讨论在这里,但它不是立即清楚,我如何做到这一点涉及到的R脚本.
编辑为响应@ll的答案,正在使用的完整脚本(上面称为'myscript.R')是
library(RJSONIO)
note.list <- c('abcdefg.json','hijklmn.json')
# unique IDs for markdown notes stored in JSON by Laverna, http://laverna.cc
for (laverna.note in note.list) {
# note.file <- path.expand(file.path('~/Dropbox/Apps/Laverna/notes',
# laverna.note))
# For the purpose of this example run the script in the same
# directory as the JSON files
note.file <- path.expand(file.path(getwd(),laverna.note))
file.conn <- file(note.file)
suppressWarnings( # warnings re: no terminating newline
cat(paste0(substr(readLines(file.conn), 2, 15)),'\n') # add said newline
)
close(file.conn)
}
Rscript myscript.R
输出
"id":"abcdefg"
"id":"hijklmn"
Rscript myscript.R | head -1
输出
"id":"abcdefg"
Error: ignoring SIGPIPE signal
Execution halted
我不清楚在这里'早期'会终止什么
编辑2它可以复制,readLines
所以我在上面的例子中删除了JSON库特定的细节.这里有脚本和虚拟JSON .
编辑3似乎有可能采用包括管道在内的命令行参数并将它们传递给pipe()
- 我会尽可能地尝试这个并解决问题.