将 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

嗯,手册页也这么说:

交互式 shell 是在没有非选项参数(除非-s指定)且没有-c选项的情况下启动的其标准输入和错误都连接到终端(由 确定isatty(3)),或者从该选项开始-iPS1设置并$-包含ibash 是否是交互式的,允许 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是设置标题的部分。

相关内容