2017-04-20 8 views
0

C#에서 bash (cygwin)가 시작되었으므로 인수로 C:\\cygwin64\\bin\\bash.exe에서 새 프로세스를 만들었습니다. 나는 또한 그 결과를 재지향했다.bash 프로세스가 C#에서 시작되면 예기치 않은 문자가 반환됩니다.

배쉬는 실행되지만 [0m[37;1m 또는 [0m> 또는 [K> 또는 >처럼 (이 모든 전에 ESC 문자가 있지만 표시 할 수 있도록 유래하지 않는 것) 출력은 예상치 못한 문자가 포함되어 있습니다. 이것은 mintty 프로그램에서 이러한 문자가 보이지 않는 것 때문에 예상치 못한 결과입니다.

왜 이런 일이 발생합니까? 이 등장 인물은 어디에서 왔습니까? 어떻게 그들을 막을 수 있습니까?

답변

0

예기치 않은 문자는 터미널 출력에 관한 텍스트 출력 형식을 지정하는 데 사용되는 이스케이프 시퀀스입니다. (이에 대한 자세한 내용은 Wikipedia: terminal emulator을 참조하십시오.)

자세한 내용은 prompt의 출력이 특정 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을에, 그것은 마디 그라처럼 찾고 있습니다. 따라서, 나는 효과를 보여 hexdump를 사용

$ 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 또한 터미널 이스케이프 시퀀스를 사용 않습니다. 그런 다음 변수 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 

$ 

Btw는. bash 프롬프트가 여전히 착색되었음을 알았습니다. 두 번 생각하면 분명해집니다. PS1 ... PS4의 이스케이프 시퀀스는 "하드 코드 됨"즉 TERM의 설정을 고려하지 않습니다.

업데이트 :

이를 테스트하기 위해 나는 샘플 스크립트 mybashrc 썼다 :

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

을 및 Windows 10 (64 비트)에 Cygwin에서의 떠들썩한 파티와 함께 ​​테스트 :

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

$ 

Btw.[Backspace] 키가 샘플 세션에서 이상하게 작동한다는 것을 알았습니다. 의도 한 효과가 있지만 출력이 잘못되었습니다. 내부 버퍼가 올바르게 처리 할 보이지만 출력 대신 마지막 문자를 삭제하는 것이다 :

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

$ 

이 (두 경우 모두에서, I는 echo "Ha 후에 한번 [백 스페이스] 입력.) 그 이유는 아마도 누락 터미널 에뮬레이션이다.

따라서 콘솔 (응용 프로그램에서)이 배쉬의 출력 채널에서 백 스페이스를 적절하게 처리하면 혼동이 없어야합니다.

+0

'bash.exe' 프로그램이 이스케이프 시퀀스와 컬러 코드를 완전히 추가하지 못하도록하는 명령이나 인수 나 매개 변수가 있습니까? – newpeople

+0

나는 인자'-i'와'--login' (그리고 다른 것들)의 영향에 관한'man bash'를 읽었을뿐입니다. 왜냐하면 이것들이 여러분의 문제와 관련이있을 수 있다는 생각이 있었기 때문입니다. 내가 제대로 이해한다면,이 주장은 주로 bash의 시작과 종료시 실행되는 스크립트를 정의합니다. 이것은 실제로 색상 지원이 내장되어 있지 않다고 믿습니다. 모든 형식은 구성별로 수행됩니다. 따라서 위의 힌트가 충분해야합니다. – Scheff

+0

따라서, 해결책은 아마 (추가 인수)'--init-file' 또는'--rcfile'과 앞서 언급 한 변수'PS1' ...'PS4'와' 용어'. – Scheff