題 為什麼在命令替換中運行時會打印cd?


如果我在命令替換中使用內置的'cd'BASH,它會向stdout打印額外的東西,但只有在管道輸入時,例如,更少。

$ 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)


3
2017-08-29 19:39


起源


我不能複制描述的行為。你用$ CDPATH嗎?它使 cd 輸出真實路徑。或者你定義了一個 別號 對於 cd? - choroba
跑 type cd,結果應該是 cd is a shell builtin。確保 echo `builtin cd .` | less 結果是一樣的。它強制使用shell builtin命令。無法複製,在OS X上bash 3.2.48(1)。 - Daniel Beck♦
我認為自bash 3.2以來必須有所改變。看到這個帖子: lists.gnu.org/archive/html/bug-bash/2007-04/msg00019.html  問題是POSIX需要在使用CDPATH時打印目錄,即使不是交互式的。為什麼這個在bash 4.x中發生了變化我不知道,但我也無法在那裡重現它。 - reasgt
用於 command 規避使用bash內置,而是執行從中返回的程序 which cd。 - Daniel Beck♦


答案:


您正在查看xterm轉義序列(ESC 2;新標題^ G)以更改窗口標題。

(以下幾乎是猜想。)

當您將輸出寫入終端時,您的終端仿真器(我猜)會在將其顯示在屏幕上之前將其從流中刪除。當您通過less管道輸出時,您會看到所有輸出。

檢查值 $PROMPT_COMMAND;你可能會在那裡看到一個打印字符串的命令(可能涉及到 $PWD 或致電 pwd)。


0
2017-08-30 01:31