答案1
在第一个中,在我看来,如果 stderr 在启动时连接到文件,Bash 就会进入非交互模式。在该模式下,它会取消设置PS1
,因此不会打印提示。从图中也可以看出$-
,它不包含i
所指的交互模式。
$ bash 2> file.txt
echo ${PS1-unset}
unset
echo $-
hBs
嗯,手册页也这么说:
交互式 shell 是在没有非选项参数(除非
-s
指定)且没有-c
选项的情况下启动的其标准输入和错误都连接到终端(由 确定isatty(3)
),或者从该选项开始-i
。PS1
设置并$-
包含i
bash 是否是交互式的,允许 shell 脚本或启动文件测试此状态。
但是,如果在 shell 启动后重定向 stderr,则会在文件中收到提示。以及您编写的任何输入:
main$ PS1='\$ ' bash
$ exec 2> file.txt
hello
^D
main$ cat file.txt
$ echo hello
$ exit
在第二种情况下,反色 ^G 提示终端响铃控制字符,它用于结束在 xterm 中设置终端窗口标题的转义序列。也许您的提示符包含类似的内容,您可以使用例如检查printf "%q\n" "$PS1"
以查看带有用反斜杠编码的特殊字符的提示符。
Debian/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
是设置标题的部分。