将输出从文件重定向到stdout

时间:2015-06-16 08:33:28

标签: bash shell unix stdout

我有一个程序只能将结果输出到-o选项的文件。这次我需要将它输出到控制台,即stdout。这是我的第一次尝试:

myprog -o /dev/stdout input_file

但它说:

  

/ dev / not writable

我发现this question与我的相似,但/dev/stdout显然不会在没有额外魔法的情况下发挥作用。

问:如何将文件中的输出重定向到stdout

P.S。没有任何专门软件的传统方法是优选的。

3 个答案:

答案 0 :(得分:5)

许多工具将-解释为stdin / stdout,具体取决于其使用的上下文。但是,这不是shell的一部分,因此取决于所使用的程序。

在您的情况下,以下内容可以解决您的问题:

myprog -o - input_file

答案 1 :(得分:4)

如果程序只能写入文件,那么您可以使用命名管道:

pipename=/tmp/mypipe.$$
mkfifo "$pipename"

./myprog -o "$pipename" &

while read line
do
    echo "output from myprog: $line"
done < "$pipename"

rm "$pipename"

首先我们创建管道,我们将它放入/tmp以防止它不受备份程序的影响。 $$是我们的PID,并且在运行时使名称唯一。

我们在后台运行程序,它应该阻止尝试写入管道。有些程序使用一种称为“内存映射”的技术,在这种情况下,这将失败,因为管道无法进行内存映射(一个好的程序会检查这个)。

然后我们像在任何其他文件中一样读取脚本中的管道。

最后我们删除了管道。

答案 2 :(得分:2)

您可cat myprog撰写的文件内容。

myprog -o tmpfile input_file && cat tmpfile

这将产生描述的效果 - 允许您将myprog的输出传递给某个后续命令 - 尽管它与您设想的方法不同。

myprog(可能更恰当notmyprog)的输出太大而无法写入磁盘的情况下,这种方法不会很好。

在同一行清理临时文件但仍在最后输出内容的解决方案将是

myprog -o tmpfile input_file && contents=`cat tmpfile` && rm tmpfile && echo "$contents"

将文件内容存储在变量中,以便在删除文件后访问该文件。请注意echo命令参数中的引号。这些对于保留文件内容中的换行很重要。