Bash 프롬프트를 파일로 리디렉션할 때 이상한 출력

Bash 프롬프트를 파일로 리디렉션할 때 이상한 출력

bash 명령의 표준 오류를 파일로 리디렉션했고 bash 프롬프트가 리디렉션되었습니다. 하지만 파일 내용을 인쇄하면 비어 있습니다. bash 프롬프트는 어디로 갔나요?

영상

다시 말하지만, bash의 stdout을 파일로 리디렉션하면 예상되는 프롬프트 대신 출력이 리디렉션되지만 파일 내용을 인쇄할 때 프롬프트에도 일부 문자가 있습니다. 어떻게?

여기에 이미지 설명을 입력하세요.

$PS1 및 $PROMPT_COMMAND의 값:

여기에 이미지 설명을 입력하세요.

나에게 설명해주세요.

답변1

첫 번째 경우에는 시작 시 stderr이 파일에 연결되면 Bash가 비대화형 모드로 전환되는 것 같습니다. 이 모드에서는 설정되지 않으므로 PS1프롬프트가 인쇄되지 않습니다. 또한 참조된 상호 작용 모드가 $-포함되어 있지 않음을 그림에서 볼 수 있습니다 .i

$ bash 2> file.txt
echo ${PS1-unset}
unset
echo $-
hBs

음, 매뉴얼 페이지에도 그렇게 나와 있습니다.

대화형 쉘은 옵션이 아닌 인수( -s지정되지 않는 한) 및 옵션 없이 -c시작됩니다.표준 입력과 오류는 모두 터미널에 연결됩니다.(확인 isatty(3)) 또는 이 옵션으로 시작하세요 -i. bash가 대화형인지 여부를 PS1설정하고 $-포함하여 쉘 스크립트나 시작 파일이 이 상태를 테스트할 수 있도록 합니다.i

그러나 쉘이 시작된 후 stderr을 리디렉션하면 파일에 프롬프트가 표시됩니다. 그리고 당신이 작성한 모든 입력:

main$ PS1='\$ ' bash
$ exec 2> file.txt
hello
^D
main$ cat file.txt 
$ echo hello
$ exit

두 번째 경우, 반전된 ^G는 xterm에서 터미널 창 제목을 설정하는 이스케이프 시퀀스를 끝내는 데 사용되는 터미널 벨 제어 문자를 프롬프트합니다. 프롬프트에 이와 같은 내용이 포함되어 있을 수 있습니다. 예를 들어 printf "%q\n" "$PS1"백슬래시로 인코딩된 특수 문자가 있는 프롬프트를 보려면 확인할 수 있습니다.

데비안에는 /etc/bash.bashrc다음과 같은 부분 헤더 이스케이프가 포함되어 있습니다.

# Commented out, don't overwrite xterm -T "title" -n "icontitle" by default.
# If this is an xterm set the title to user@host:dir
#case "$TERM" in
#xterm*|rxvt*)
#    PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'
...

PROMPT_COMMAND프롬프트 자체가 아니라 프롬프트 자체 에 있지만 아이디어는 동일합니다. \033]0;과 사이의 부분이 \007제목을 설정하는 부분입니다.

관련 정보