stdout と stderr の出力を処理しながら、シェル スクリプトを実行したいと考えています。現在、stdin、stdout、stderr のProcess.run
、 with 、および 3 つのパイプを使用してコマンドを実行しています。shell=false
stdout と stderr から読み取り、出力をログに記録 (またはその他の方法で処理) するファイバーを生成します。これは、個々のコマンドではうまく機能しますが、スクリプトではひどく失敗します。
shell=true
を呼び出すときに簡単に設定できますProcess.run
が、Crystal ソースを見ると、コマンドラインの先頭に「sh」を追加するだけのようです。「bash」を先頭に追加しようとしましたが、役に立ちませんでした。
リダイレクト ( >file
) やパイプ (例curl something | bash
) のようなものは動作しないようですProcess.run
たとえば、シェルスクリプトをダウンロードして実行するには、次のことを試しました。
cmd = %{bash -c "curl http://dist.crystal-lang.org/apt/setup.sh " | バッシュ}
Process.run(cmd, ...)
イニシャルbash
は、パイプ オペレーターを有効にすることを期待して追加されました。役に立たないようです。また、各コマンドを個別に実行してみました:
script.split("\n").reject(/^#/, "").each { Process.run(...) }
しかしもちろん、コマンドがリダイレクトやパイプを使用している場合は失敗します。たとえば、コマンドecho "deb http://dist.crystal-lang.org/apt crystal main" >/etc/apt/sources.list.d/crystal.list
は単純に次のように出力します。
"deb http://dist.crystal-lang.org/apt crystal main" >/etc/apt/sources.list.d/crystal.list`
``
代わりにバックティックの実行方法を使用するとうまくいくかもしれません。しかし、そうすると、出力をリアルタイムでキャプチャすることができなくなります。