F#で外部コマンドを起動し, その標準出力結果を扱う

コード

open System.IO
open System.Diagnostics

let cmd = new Process()
cmd.StartInfo.FileName <- "ls"
cmd.StartInfo.Arguments <- "-l /usr/bin"
cmd.StartInfo.UseShellExecute <- false
cmd.StartInfo.RedirectStandardOutput <- true

if cmd.Start() |> not then
    failwith "Failed to execute command"

using (new StreamWriter("tmp.txt")) (fun writer ->
    cmd.OutputDataReceived.Add(fun e -> writer.WriteLine(e.Data))
    cmd.BeginOutputReadLine()
    cmd.WaitForExit())

C#と同じではあるのだけど。ハマりどころとしては event(OutputDataReceived)を使わないと出力が大きい場合 4096 byteしか読めないという問題があった. ただ行単位かつ改行コードは stripされた状態でイベントハンドラーに渡ってくるので微妙な感じは少しある. 今は dotnetクロスプラットフォームだけど プロセスの扱いとかは Win32 APIにめちゃ引っ張られているなぁという感じがする.