【发布时间】:2017-08-08 13:30:56
【问题描述】:
我有一个程序可以同时读取两个输入文件。我想让这个程序从标准输入中读取。我想我会使用这样的东西:
$program1 <(cat) <($program2)
但我刚刚发现
cat <(cat)
生产
....
mmap2(NULL, 139264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb758e000
read(0, 0xb758f000, 131072) = -1 EIO (Input/output error)
....
cat: -: Input/output error
同样,
$ cat <(read -n 1)
bash: read: read error: 0: Input/output error
所以... Linux 在系统调用级别上无法read。那很有意思。 bash 没有将标准输入连接到子外壳吗? :(
有解决办法吗?我特别需要使用进程替换(... <(...) 格式),因为$program1(tail,顺便说一下)需要文件,并且我需要对标准输入进行一些预处理(使用od),然后才能将其传递给tail - 我不能只指定 /dev/stdin 等人。
编辑:
我真正想做的是从文件中读取(另一个进程将写入该文件),而我也从标准输入中读取,因此我可以接受命令等。我希望我能做到
tail -f <(od -An -vtd1 -w1) <(cat fifo)
同时从标准输入和读取FIFO并将其放入可以通过awk(或类似方法)运行的单个stdout流中。我知道我可以用任何脚本语言轻松解决这个问题,但我喜欢学习如何让bash 做所有事情:P
编辑 2:我已询问 a new question,以便更全面地解释我刚才描述的上下文。
【问题讨论】:
-
很有趣,因为它适用于 OS-X。所以不像我最初怀疑的那样来自 bash。这很有趣。
-
@DanielVoina:感谢您提供的信息,我对其他平台很好奇!
-
我不太了解您的真正需求,因为
tail和stdin有点奇怪。希望我的回答能给你一些提示。 -
在 StackOverflow 上看到这样的问题让我对编程职业有了希望
-
@whjm:非常好的观点。我fully described the context in a new question,并接受了你对这个问题的回答,因为它确实回答了它:)
标签: bash io stdin subshell process-substitution