9

エラーを返すか、Windowsで終了しない次のコマンドを実行しようとすると、エラーが文字列として返されるのではなく、常に空のリストが返されます。たとえば、次のようになります。

私は得る:

[] = os:cmd("blah").

のようなものの代わりに

"command not found" = os:cmd("blah").

Linux では、すべてが期待どおりに機能するため、「/bin/sh: 1 行目: 何とか: コマンドが見つかりません\n」と表示されます。

したがって、実行がどのように終了したかなどを知る必要がある場合、その機能に頼ることはできません。コマンドを実行してエラーコードを含む結果を取得する一般的な方法を提案してください。

ありがとう!

4

1 に答える 1

11

私は Windows にまったく詳しくありませんが、きっと、これを見た方がいいでしょ 。これは実装os:cmd/1関数です。

に問題がありos:cmd/1ます。この関数は、コマンドの実行が成功したかどうかを通知しないため、(プラットフォームに依存する) 特定のコマンド シェルの動作に依存するだけで済みます。

関数を使用することをお勧めしますerlang:open_port/2。そんな感じ:

my_exec(Command) ->
    Port = open_port({spawn, Command}, [stream, in, eof, hide, exit_status]),
    get_data(Port, []).

get_data(Port, Sofar) ->
    receive
    {Port, {data, Bytes}} ->
        get_data(Port, [Sofar|Bytes]);
    {Port, eof} ->
        Port ! {self(), close},
        receive
        {Port, closed} ->
            true
        end,
        receive
        {'EXIT',  Port,  _} ->
            ok
        after 1 ->              % force context switch
            ok
        end,
        ExitCode =
            receive
            {Port, {exit_status, Code}} ->
                Code
        end,
        {ExitCode, lists:flatten(Sofar)}
    end.

そのため、関数はプロセス標準出力とともにプロセス終了コードmy_exec/1を返します。

于 2014-11-20T19:06:24.797 に答える