2014-07-24 2 views
0

이것은 모든 출력을 터미널에 전달하는 here의 연속입니다. 이 스크립트는 내 컴퓨터에서 정상적으로 실행되었지만 다른 컴퓨터에서는 파일을 쓰거나 인쇄 할 때 espeak으로 파이핑 할 때 여분의 내용을 듣지 않았습니다. 약간의 시행 착오로 디버그하는 데 약간의 어려움이있었습니다. PROMPT_COMMAND="__vte_prompt_command"이라고 생각하는 것을 수행하는 것으로 ~/.bashrc ->/etc/bashrc ->/etc/profiles.d/vte.sh으로 좁혀졌습니다. 적어도 PROMPT_COMMAND=vte.sh을 소싱 한 후에 수정되지 않는다고 생각했습니다.보이지 않는 터미널 출력이 스크립트를 깨고 있습니다.

여하튼 어떤 특수 문자가 인쇄되어 창 제목 (printf "\033]0;%[email protected]%s:%s\007%s"...?)을 변경하는 것으로 보입니다. 이러한 문자는 파일에 쓰거나 터미널에 출력 할 때 표시되지 않지만 espeak과 같이 앱에 연결하면 나타납니다.

내 첫 번째 질문은 이러한 특수 문자의 존재를 어떻게 감지합니까?

while read line 
do 
    espeak "$line" #can hear extra stuff 
    echo "GOT: [$line]" #only expected output printed 
done <input_pipe 

나의 다음 질문은 내가 루프에있는 눈에 보이지 않는/특수 출력을 무시할 수있는 방법, 입니다 (난 단지 아주 느린 시행 착오에 의해 vte 발견)? (내가 궁극적으로 터미널에 볼 것이다에만 caracters 수)

답변

1

당신은 특별한 매개 변수 확장과 해당 문자를 제거하는 시도 할 수 있습니다 : 그 문자의 16 진수 값을 볼 수 echo -n "$line" | hexdump -C를 실행하는

line=${line//stringtodelete} 
line=${line//[charstodelete]} 

시도합니다.

그럼 당신은

$'\x01\x02abc' 

노트처럼 뭔가를 할 수 있습니다

  • 배쉬는 각각 \[$'\x01'PS1\]$'\x02'을 대체하지만 난 잘 모르겠어요 그들이 실제에 전송하는 경우 산출.
  • $'\x##'은 헥스 형태이고 $'\000'은 oct 형태이다.
+0

문자를 스트립하는 것만으로는 충분하지 않습니다. 전체 "제어"시퀀스 제거 [regex 사용] (http://unix.stackexchange.com/questions/14684/removing-control-chars-including-console-codes-colours-from-script-output) 예쁜 일을하는 것처럼 보입니다. 좋은 직업이지만 나는 더 좋은 방법이 있어야한다고 느끼고있다. 정보 주셔서 감사합니다! 특히'hexdump '. – jozxyqk

관련 문제