为什么在命令替换中运行时 cd 会打印?

为什么在命令替换中运行时 cd 会打印?

如果我在命令替换中使用 BASH 内置的“cd”,它会将额外的内容打印到标准输出,但只有通过管道传输到 less 时才会这样。

$ echo `cd .`

# The output is a single newline, appended by echo.


$ echo `cd .` | less
# less displays:
ESC]2;my.hostname.com - tmp/testenv^G
(END) 

那里发生了什么?此行为未记录在 cd 的 bash 手册页中。显然,在命令替换中仅运行“cd”是愚蠢的,但类似

NEWDIR=`cd mypath; pwd`

可能会有用。

我通过使用来解决这个问题

NEWVAR=`cd mypath > /dev/null 2>&1; pwd`

但我还是想知道发生了什么。

Bash 版本:GNU bash,版本 3.2.25(1)-release(x86_64-redhat-linux-gnu)版权所有 (C) 2005 Free Software Foundation, Inc.

发行版:Scientific Linux SL 版本 5.5 (Boron)

答案1

您看到 xterm 转义序列 ( ESC 2; new-title^G ) 用于更改窗口标题。

(以下内容大部分为猜测。)

当您将输出写入终端时,终端仿真器(我猜)会先将其从流中删除,然后再将其显示在屏幕上。当您通过 less 管道传输输出时,您会看到所有输出。

检查的值$PROMPT_COMMAND;您可能会在那里看到一个打印字符串的命令(可能涉及$PWD或调用pwd)。

相关内容