Grep

ls 輸出多個列,即使使用 grml 的 zsh 配置通過管道傳輸到 grep

  • March 4, 2012

我剛決定讓 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) 問題的完整範例更新您的問題,同時顯示實際目錄內容和您的特定命令行’重新使用。

引用自:https://unix.stackexchange.com/questions/33360