답변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
제목을 설정하는 부분입니다.