ls 輸出多個列,即使使用 grml 的 zsh 配置通過管道傳輸到 grep
我剛決定讓 zsh 與 Bash 對抗,但遇到了一些我在網上找不到任何東西的不方便行為:
如果您
ls | grep foo
在 Bash 中執行操作,則ls
每行僅包含一個文件,以便grep
僅輸出匹配的文件。似乎在某個地方(因為我在配置中找不到任何東西,我認為它一定是 Bash 程式碼本身),該-1
選項被傳遞給ls
.然而,zsh 並沒有那麼神奇:如果你在
ls
沒有進一步選項的情況下傳遞給grep
,它就是這樣做的,你也會得到結果,它巧合地出現在與匹配相同的行上。我在 zsh 中實現 Bash 行為的想法是檢測
ls
輸出是否將通過管道傳輸grep
並為這種情況定義類似別名的東西。但我不確定如何以及是否可能。**更新:**正如 larsks 在下面指出的那樣,Bash 在這裡沒有做任何特別的事情
ls
,如果輸出不進入終端,它確實應該以這種方式工作。然而,這就是發生在我身上的事情:
> ls a b c d e f g h bash$ ls | grep b b zsh> ls | grep b a b c d e f g h
我已經能夠在帶有 zsh 4.3.11 和 GNU coreutils 8.5 的 Ubuntu 11.10 以及帶有 zsh 4.3.10 的 Debian Squeeze 機器上重現它。
**更新 2:**在進行更多調查時,我發現此錯誤僅在grml .zshrc處於活動狀態時出現。那裡必須有一些東西可以打開一個輸出終端,如果它是管道的話。有人知道要尋找什麼嗎?
通過縮小到 中的責任線
.zshrc
,我可以自己弄清楚:它實際上比某種用於管道的虛擬終端要簡單得多。錯誤來自grml 配置的第 1477 行,如下所示:
alias ls='ls -b -CF '${ls_options:+"${ls_options[*]} "}
所以該
ls
命令顯然不是直接呼叫的,而是通過別名呼叫的。-C
並且那個通過選項顯式地啟動列輸出。
根據
ls
文件,此行為是ls
命令所固有的:`-1' `--format=single-column' List one file per line. This is the default for `ls' when standard output is not a terminal.
當使用 管道連接到另一個程序時
|
,stdout
不應該是 tty。bash
沒有做任何特別的事情。在我的所有測試中,
zsh
在 Linux 上使用 4.3.15 版本,zsh
在 OS X 上使用 4.3.11,ls
其行為方式zsh
與在bash
. 如果您確實認為您看到了不同的行為,請使用 (a)zsh
您正在使用的版本和 (b) 問題的完整範例更新您的問題,同時顯示實際目錄內容和您的特定命令行’重新使用。