有
script.sh
#!/bin/sh
sh <<EOF
cat | xargs -n 1 echo captured
echo first
echo second
EOF
运行它会输出
captured echo
captured first
captured echo
captured second
因此第二个和第三个(
echo
)命令没有被执行,而是cat
只是捕获并耗尽所有即将到来的命令流并放入其管道
除了打电话
echo input | script.sh
会有完全相同的效果。
具有与纯脚本文件完全相同的三个命令
script-plain.sh
#!/bin/sh
cat | xargs -n 1 echo captured
echo first
echo second
会有不同的行为并且
echo input | script.sh
会输出
input
first
second
那么如何实现流管道,例如
curl some-streaming-endpoint
连续输出类似的东西
echo ping 1
cat
echo ping 2
echo ping 3
....
echo ping n
将它们作为普通脚本执行的行为,并且主题命令捕获 shell 标准输入本身(如果有)而不是命令源
如何制作类似于
的脚本
executor.sh
#!/bin/sh
curl some-streaming-endpoint | sh
通过类似的调用
echo "data 1\n$data 2" | ./executor.sh
会产生输出
ping 1
data 1
data 2
ping 2
ping 3
...
ping n
附注没有临时管道命令到文件中,即
curl some-source > ~/tmp/source.sh
~/tmp/source.sh
因为流可能是连续的
我自己找到了解决方案
可以通过重定向来实现
executor.sh
#!/bin/sh
4<&0 curl some-streaming-endpoint \
| xargs -L 1 echo '0<&4' \
| sh
也许这可以通过一些更简单的方式解决?