如何将标准输出从右重定向到左

如何将标准输出从右重定向到左

这很完美:

./foo | ./bar

但我想要这样的东西:

./bar <| ./foo

所以我可以以相反的方式进行管道传输,并在命令行中更快地更改 foo 的参数。

管道需要是实时的 - 我的foo程序永远不会返回。

这可能吗 ?

答案1

一个简单而正确的方法是定义一个 foobar 函数,

foobar () { ./foo "$@" | ./bar ; }

(根据需要在命令行中,或者在某些启动脚本中,例如“.bashrc”)。然后每当你这样做时:

foobar "this"  that   "and this also"

会的

./foo  this   that   "and this also" | ./bar

答案2

./bar < <( ./foo )

例如:cat < <(echo "hello there!")

要了解其工作原理,请单独考虑脚本的各个部分。

此语法:cat < /path/to/file将读取文件/path/to/file并将其作为标准输入传输到cat.

此语法:<(echo "hello there!")表示执行命令并将标准输出附加到文件描述符,例如/dev/fd/65.整个表达式的结果是一个类似 的文本/dev/fd/65,以及一个并行运行的命令并提供该文件描述符。

现在,组合起来,脚本将运行右侧命令,将其通过管道传输到文件描述符,将该文件描述符转换为左侧命令的标准输入,然后执行左侧命令。

据我所知,没有任何开销,它与 完全相同a | b,只是语法糖。

答案3

我认为你可以使用命名管道做类似的事情:

mypipe=$(mktemp -d /tmp/XXXXXX)/pipe
mkfifo $mypipe
grep something < $mypipe & tail > $mypipe -f  some_input_file 
rm $mypipe

或者将命令中不变的部分放入 shell 脚本中:

./foo "$@" | ./bar

foo并在脚本命令行上给出参数:

./myscript <args to foo>

相关内容