ls は、 grml の zsh 構成を使用して grep にパイプする場合でも、複数の列を出力します。

ls は、 grml の zsh 構成を使用して grep にパイプする場合でも、複数の列を出力します。

私はBashにzshを使用することにしましたが、オンラインで情報が見つからないいくつかの不快な動作に直面しました。

ls | grep fooBashで操作を実行する場合は、一致するファイルのみを出力するように1行にls1つのファイルのみを含めてください。grepどこかで(設定で何も見つからないので、Bashコード自体でなければならないと仮定します)、この-1オプションがに渡されるようですls
しかし、zshはあまり魔法ではありません。ls追加のオプションGiveを使用せずにgrep渡すと、そうすると結果も得られますが、結果は試合と同じ行にあります。

lszshでBashの動作を実装するための私のアイデアは、出力がパイプされるかどうかを検出し、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

私は、GNU coreutils 8.5でzsh 4.3.11を使用するUbuntu 11.10とzsh 4.3.10を使用するDebian Squeezeシステムでこれを再現できました。

アップデート2:さらなる調査により、このエラーは次の場合にのみ発生することがわかりました。grml.zshrc活動的な。パイプで接続されている場合は、出力端子を開くことができるものが必要です。何を探すべきかを知っている人はいますか?

答え1

lsドキュメントによると、この動作はls次のコマンドに固有のものです。

`-1'
`--format=single-column'
     List one file per line.  This is the default for `ls' when standard
     output is not a terminal.

パイプを使用して他のプロセスに接続する場合は、|ttystdoutではないはずです。 bash特別なことはありません。

すべてのテストでzshLinuxバージョン4.3.15と4.3.11をzshバージョンOSで使用し、(b)実際のディレクトリの内容と特定のコマンドラインの再利用を示す問題の完全な例で質問を更新しました。lszshbashzsh

答え2

次の責任ラインで範囲を絞り込んで.zshrc自分で把握できます。

実際、ある種のパイプ仮想端末よりもはるかに簡単です。エラーは行1477で発生します。grmlの設定次のようになります。

alias ls='ls -b -CF '${ls_options:+"${ls_options[*]} "}

したがって、lsコマンドは明らかに直接呼び出されるのではなく、エイリアスを介して呼び出されます。このオプションは、このオプションを介して熱出力を明示的に有効にします-C

関連情報