将输出从文件重定向到标准输出

Redirect output from file to stdout

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

myprog -o /dev/stdout input_file

但是它说:

/dev/ not writable

我发现 this question 和我的很相似,但是 /dev/stdout 显然没有一些额外的魔法是行不通的。

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

P.S。没有任何专门软件的常规方法是可取的。

您可以catmyprog写的文件内容。

myprog -o tmpfile input_file && cat tmpfile

这将产生所描述的效果——允许您将 myprog 的输出通过管道传递给某些后续命令——尽管这与您预想的方法不同。

myprog(也许notmyprog更合适)的输出太大而无法写入磁盘的情况下,这种方法并不好。

在同一行中清理临时文件并在最后仍然通过管道输出内容的解决方案是这样

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

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

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

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

./myprog -o "$pipename" &

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

rm "$pipename"

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

我们 运行 后台程序,它应该阻止尝试写入管道。一些程序使用一种称为 "memory mapping" 的技术,在这种情况下这将失败,因为管道不能被内存映射(一个好的程序会检查这一点)。

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

最后我们删除了管道。

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

对于您的情况,以下方法可以解决您的问题:

myprog -o - input_file