使 sh 命令流捕获标准输入

问题描述 投票:0回答:1

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

因为流可能是连续的

shell stdin capture
1个回答
0
投票

我自己找到了解决方案

可以通过重定向来实现

executor.sh

#!/bin/sh

4<&0 curl some-streaming-endpoint \
| xargs -L 1 echo '0<&4' \
| sh

也许这可以通过一些更简单的方式解决?

© www.soinside.com 2019 - 2024. All rights reserved.