【发布时间】:2016-07-29 23:24:32
【问题描述】:
我想通过标准输入将脚本和数据通过管道传输到 shell 及其子进程。基本上,我正在启动一个 shell 并通过标准输入向 shell 发送一个类似 "exec wc -c;\n<data>" 的字符串。
我希望启动一个子流程并将数据传递给所述子流程。
使用 exec 我完全希望 wc -c 替换我的 shell 并计算通过标准输入发送的字节数。
例子:
echo -ne 'exec wc -c;\nabc' | dash
echo -ne 'exec wc -c;\nabc' | bash
echo -ne 'exec wc -c;\nabc' | bash --posix
echo -ne 'exec wc -c;\nabc' | busybox sh
它似乎与 bash 一致,但不适用于 dash 或 busybox sh。他们似乎都间歇性地失败了。如果我在通过标准输入发送<data> 之前睡了 100 毫秒,那么它可以工作。但是睡觉并不是一个可靠的解决办法。
实际上,我正在发送大量数据,因此我不想对其进行编码或以某种方式将其存储在内存中。有什么想法吗?
注意:我确信有很多用例可以解决这个问题。但我正在寻找为什么这不能始终如一地工作。和/或我可以做些什么来让它可靠地工作,最好是跨平台:)
更新:为了澄清我有一个远程系统,我在其中运行 sh 并公开 stdin/stdout/stderr,我想证明这样的设置可以做任何事情。通过发送"exec cat - > /myfile;\n<data>",可以想象我可以流入/myfile,这样它就包含<data>。再次想象<data> 很大。
本质上,我希望证明可以仅使用sh 的标准输入来控制系统。除了sh 之外,其他非常简单的东西也可以作为静态二进制文件跨平台使用。
我承认这可能完全是疯狂的,我应该使用像 SSH 之类的协议,但我可能不得不实现它。
【问题讨论】:
-
为什么要启动一个shell?为什么不
echo -n 'abc' | wc -c或更一般地说generatedata | process?你认为启动一个 shell 然后exec-ing 出来的好处是什么? -
顺便说一句,如果您关心可移植性,您可能希望养成使用带有 any 标志的
printf而不是echo的习惯;-n在 POSIX 中是明确的未定义行为,而任何echo在其参数列表中传递-e时,除了在输出上打印-e之外执行任何其他操作,不仅在未定义空间中,而且行为与标准相反。请参阅pubs.opengroup.org/onlinepubs/009604599/utilities/echo.html,尤其包括应用使用部分。