我有一个程序,只能通过-o
选项将结果输出到文件中。这一次我需要将其输出到控制台,即stdout
。以下是我的第一次尝试:
myprog -o /dev/stdout input_file
但是它显示:
/dev/ 不可写
我发现这个问题与我的类似,这里有一些相关信息,但是使用
/dev/stdout
显然需要一些额外的魔法。问题:如何将文件输出重定向到
stdout
?备注:最好使用没有任何专业软件的传统方法。
-
解释为标准输入/输出。但这不是shell的一部分,因此取决于所使用的程序。myprog -o - input_file
如果程序只能写入文件,那么您可以使用命名管道:
pipename=/tmp/mypipe.$$
mkfifo "$pipename"
./myprog -o "$pipename" &
while read line
do
echo "output from myprog: $line"
done < "$pipename"
rm "$pipename"
首先我们创建一个管道,将其放置在/tmp
目录下,以避免备份程序干扰。 $$
是我们的PID,并使名称在运行时唯一。
我们在后台运行程序,它应该阻塞尝试向管道写入数据。有些程序使用一种称为“内存映射”的技术,在这种情况下,会失败,因为管道无法进行内存映射(好的程序会检查此情况)。
然后,我们像读取其他文件一样在脚本中读取管道。
最后,我们删除管道。
myprog
在打开目标文件之前删除了它;实际上似乎是这种情况,因为-o /dev/stdout
返回错误/dev/ not writable
。其次,如果myprog
需要通过输出文件进行lseek()
操作;这不是很常见,但绝对有可能发生。 - lcd047lseek()
,那么接受的答案将不起作用(mmap()
也是如此),但如果输出文件是“-”,则可能只是走了不同的分支。惊讶的是这不在程序的文档中。 :-) - cdarkecat
命令查看由myprog
编写的文件的内容。
myprog -o tmpfile input_file && cat tmpfile
这将产生所描述的效果,允许您将myprog
的输出传输到后续的某些命令中,尽管它是一种与您设想的不同的方法。myprog
(也许更适当地称为notmyprog
)的输出太大而无法写入磁盘,则此方法将不可行。myprog -o tmpfile input_file && contents=`cat tmpfile` && rm tmpfile && echo "$contents"
它将文件的内容存储在一个变量中,以便在删除文件后可以访问该变量。请注意echo
命令参数中的引号。这些引号很重要,以保留文件内容中的换行符。myprog
的具体功能,那么我们就无法确定什么是正常的。例如:如果整个程序的目的是输出文件太大而无法存储在磁盘上,并且我们正在重定向输出以便在写入时进行消耗,那么临时文件就没有用处。 - ckhanmmap
,因为接受的答案也不起作用(使用mmap
创建和写入整个文件本来就很棘手)。 - cdarke
myprog -o - input_file
。通常情况下,-
被解释为标准输入/输出,但这取决于程序,而不是 shell 的一部分。 - Rambo Ramon