読者です 読者をやめる 読者になる 読者になる

たいちょーの雑記

ぼくが3日に一度くらい雑記をかくところ

今更改行コードで死にかけたお話

C# Unity bash

コタツに入っていても手は寒い

何とかなりませんかね?

改行コード

ふと思い立ってC#からbashを起動したくなった。
bashの起動自体は

Process process = new Process();
ProcessStartInfo psi_bash = new ProcessStartInfo();
//設定
psi_bash.FileName= @"C:\cygwin64\bin\bash.exe";
psi_bash.RedirectStandardInput = true;
psi_bash.RedirectStandardOutput = true;
psi_bash.RedirectStandardError = true;
psi_bash.CreateNoWindow = true;
psi_bash.UseShellExecute = false;
psi_bash.Arguments = "--login";
psi_bash.StandardErrorEncoding = System.Text.Encoding.UTF8;
psi_bash.StandardOutputEncoding = System.Text.Encoding.UTF8;

//プロセス起動
process = Process.Start(psi_bash);
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.OutputDataReceived += onBashOutput;
process.ErrorDataReceived += onBashError;

とまぁこんなふうに標準入出力を確保して起動すれば標準入力のStreamWriterに書き込めば次々とbashのコマンドを実行するんですぜ

private void sendToCygwinBash(Process bash) {
    StreamWriter sw = bash.StandardInput;
    if (sw.BaseStream.CanWrite) {
        sw.WriteLine(command);
    }
}
private void onBashOutput(object sender, DataReceivedEventArgs e) {
    outputCommand(e.Data);
}

private void onBashError(object sender, DataReceivedEventArgs e) {
    outputCommand(e.Data);
}

標準出力や標準エラー出力はリダイレクトしてて出力を読み取るたびにイベントが呼び出されるのでそこは楽でした。

問題は入力

上のコードを見ると入力を適当に受け取ってStreamWriterに適当に書き込んでますがなんか出力がへん
入力はls
出力はhomelsした結果が返ってくると踏んでました。

CRNL1

エラーでとるやんけ!

文字化けもしとるやんけ!

この際文字化けはいいですがbashがなんて言ってるのかはだいたい掴めます

ls\rなんてコマンドはないです

さいですか

謎の\r

どこから降って湧いたのか改行コード\rがこんにちはしていますね。
これのせいでbashがコマンドを理解できないでいます。うっとうしい

手始めにコマンドを格納している変数commandにコマンドを格納するときに紛れ込んでしまったとみてReplace

command = command.Replace(System.Environment.NewLine, "");

CRNL1

ダメみたいですね。
ていうかそもそもcommandを出力させてるところに\rが紛れ込んでない時点でここじゃないですね~

ならばStreamWriterかな?

private void sendToCygwinBash(Process bash) {
    StreamWriter sw = bash.StandardInput;
    sw.NewLine="\n";
    if (sw.BaseStream.CanWrite) {
        sw.WriteLine(command);
    }
}

CRNL2

あっうまくいった!

大した問題ではなかったですがここで躓いてたら 大いなる計画 がとん挫するところだったので解決してよかったです。

それでは良い改行コードライフを!