2017-04-20 2 views
0

私はC#からbash(cygwin)を開始しました。その目的のためにから新しいプロセスを作成しました。引数は--login -iです。私はその出力をリダイレクトしました。bash process from C#は予期しない文字を返します

bashは実行されますが、出力は(ESC文字はこれらのすべての前にありますが、それが表示されるようにするstackoverflowのようではありません)[0m[37;1mまたは[0m>または[K>あるいは>などの予期しない文字が含まれています。これは私がminttyプログラムからこれらの文字のいずれかを見ていないような予期しない原因です。

どうしてですか?これらのキャラクターはどこから来たのですか?どのように私はそれらが表示されないようにすることができますか?

答えて

0

予期しない文字は、(端末エミュレータに関する)テキスト出力をフォーマットするために使用されるエスケープシーケンスです。 (詳細はWikipedia: terminal emulatorを参照してください)

具体的には、プロンプトの出力は特定のbash変数、つまりPS1, PS2, PS3, PS4を使用して設定できます。 How to change bash prompt color based on exit code of last command?には、それらを修正する効果が表示されています。

あなたのケースでは、bashの呼び出しは、エスケープシーケンスを使わずに簡単に再定義する特別なスクリプトを用意する必要があります。したがって、望ましくない書式を取り除くことができます。これは助けてくれるかもしれません:SO: Running a custom profile file on remote hostしかしこれはまた有望に思われる:Is it possible to start a bash shell with a profile at a custom location, in a one liner command?

これを書いて、特定のコマンド(例:ls)が色付き出力もサポートしていることを思い出しました。私がわからなかったので、私はこれを試してみました:

$ mkdir test ; cd test ; touch test1 ; ln -s test1 test2 ; mkdir test3 ; touch test4 ; chmod a+x test4 

$ ls --color 
test1 test2 test3 test4 

$ 

私はここで、色でそれをフォーマットする方法を知りませんが、私のxterm上で、それはマルディグラのように見ています。あなたが見ることができるように

$ ls --color | hexdump -c 
0000000 t e s t 1 \n 033 [ 0 m 033 [ 0 1 ; 3 
0000010 6 m t e s t 2 033 [ 0 m \n 033 [ 0 1 
0000020 ; 3 4 m t e s t 3 033 [ 0 m \n 033 [ 
0000030 0 1 ; 3 2 m t e s t 4 033 [ 0 m \n 
0000040 

lsは、端末エスケープシーケンスを使用しないこのように、私は効果を示すためhexdumpを使用しています。その後、変数TERMを思い出しました。このリンクThe TERM variableには、おそらくゲームの一部であるterminfoまたはtermcapも含まれています。

したがって、PS1 ... PS4の再定義に加えて、また、TERMを再定義するために有用である可能性:

$ TERM= 

$ ls --color | hexdump -c 
0000000 t e s t 1 \n t e s t 2 \n t e s t 
0000010 3 \n t e s t 4 \n         
0000018 

$ 

ところで。私はbashプロンプトがまだ色づけされていることを認識しました。これは2回考えられます。PS1 ... PS4のエスケープシーケンスは「ハードコードされている」つまりTERMという設定は考慮されません。

更新:

これをテストするために、私はサンプルスクリプトmybashrc書きました:

PS1="> " 
PS2=">>" 
PS3= 
PS4="++ " 
TERM= 

をし、Windows 10(64ビット)上でcygwinの中のbashでそれをテストした:

$ bash --init-file mybashrc -i 
> echo "$PS1 $PS2 $PS3 $PS4" 
> >> ++ 
> exit 
exit 

$ 

Btw。私は[バックスペース]キーがサンプルセッションで何らかの形で異常に機能していることに気付きました。それでも意図した効果はありますが、出力が間違っています。出力ではなく、内部バッファはこれを正しく処理するようだが、最後の文字を削除するです:

$ bash --init-file mybashrc -i 
> echo "Ha ello" 
Hello 
> echo "Ha ello" | hexdump -c 
0000000 H e l l o \n 
0000006 
> exit 
exit 

$ 

(どちらの場合も、私はecho "Ha後、[Backspace]キーを一度入力しました。)理由はおそらく不足している端末エミュレーションです。

このように、(アプリケーションの)コンソールがbashの出力チャネルのバックスペースを適切に処理すると、混乱を避けることができます。

+0

'bash.exe'プログラムがエスケープシーケンスとカラーコードを完全に追加しないようにするためのコマンドや引数やパラメータはありますか? – newpeople

+0

私は '-i'と' --login'(そして他のもの)の引数の効果に関する 'man bash'という方針を読んだところです。なぜなら、あなたの問題にも関連していると思っていたからです。私が正しく理解していれば、これらの引数は主に、bashの起動時と終了時に実行されるスクリプトを定義します。これにより、実際にはカラーサポートが組み込まれていないと私は信じられます。すべてのフォーマットは設定によって行われます。したがって、上記のヒントは十分であるはずです。 – Scheff

+0

このように、解決策はおそらく(追加引数) '--init-file'または' --rcfile'と、前述の変数 'PS1' ...' PS4'と ' TERM'。 – Scheff

関連する問題