stdinにスクリプトとデータの両方をシェルとその子プロセスに渡したいと思っています。基本的には、シェルを起動し、"exec wc -c;\n<data>"
のような文字列をstdin上のシェルに送ります。bash/sh/busyboxがstdinを子プロセスに渡す
私はサブプロセスを開始し、そのサブプロセスにデータを渡すことを検討しています。 を使用するexec
wc -c
は私のシェルを置き換え、stdin経由で送信されたバイト数を数えます。
例:
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のではなく、ダッシュやbusybox sh
で一貫して動作するようです。両方とも断続的に失敗するようです。私が100ms待ってから<data>
をstdinに送ると、それは動作します。しかし、睡眠は信頼できる解決策ではありません。
私は実際にはデータの量は少ないので、エンコードしたり、何らかの形でメモリに格納したりすることは望ましくありません。何か案は?
注:これを回避することができる多くのユースケースがあると確信しています。しかし、私はこれがなぜ一貫して機能しないのかを探しています。および/またはどのようなシェル魔法私は、それは好ましくはプラットフォーム間で、確実に動作させるために行うことができます:)
アップデート:私はsh
を実行して、/ stderrの標準入力/標準出力を公開するリモートシステムを持って明確にするために、私は希望そのような設定が何かを行うことができることを証明する。 "exec cat - > /myfile;\n<data>"
を送信すると、私は<data>
が含まれるように/myfile
にストリームすることができます。再び<data>
が大きいと想像してください。
本質的には、sh
のstdinを使用してシステムを制御できることを証明しようとしています。 sh
の代わりに非常に単純なものが、静的バイナリとしてプラットフォーム間で容易に利用できます。
これは完全に狂っているかもしれないと私はSSHまたは何かのようなプロトコルを採用すべきだと認めますが、それから私はそれを実装する必要があります。
なぜ、 'echo -n 'abc' | wc -c'やもっと一般的には' generatedata | process'?シェルを起動して 'exec'を実行する利点は何ですか? – John1024
ところで、移植性を気にしているなら、*任意の*フラグで 'echo'ではなく' printf'を使う傾向がありますが、 '-n'はPOSIXでは明示的に未定義の動作ですが、その引数リストに '-e'を渡したときに' -e'を出力する以外のものはjではない定義されていないスペースにあっても、標準に反して動作します。特にAPPLICATION USAGEセクションを含むhttp://pubs.opengroup.org/onlinepubs/009604599/utilities/echo.htmlを参照してください。 –