这很完美:
./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>