私はBashにzshを使用することにしましたが、オンラインで情報が見つからないいくつかの不快な動作に直面しました。
ls | grep foo
Bashで操作を実行する場合は、一致するファイルのみを出力するように1行にls
1つのファイルのみを含めてください。grep
どこかで(設定で何も見つからないので、Bashコード自体でなければならないと仮定します)、この-1
オプションがに渡されるようですls
。
しかし、zshはあまり魔法ではありません。ls
追加のオプションGiveを使用せずにgrep
渡すと、そうすると結果も得られますが、結果は試合と同じ行にあります。
ls
zshで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
特別なことはありません。
すべてのテストでzsh
Linuxバージョン4.3.15と4.3.11をzsh
バージョンOSで使用し、(b)実際のディレクトリの内容と特定のコマンドラインの再利用を示す問題の完全な例で質問を更新しました。ls
zsh
bash
zsh
答え2
次の責任ラインで範囲を絞り込んで.zshrc
自分で把握できます。
実際、ある種のパイプ仮想端末よりもはるかに簡単です。エラーは行1477で発生します。grmlの設定次のようになります。
alias ls='ls -b -CF '${ls_options:+"${ls_options[*]} "}
したがって、ls
コマンドは明らかに直接呼び出されるのではなく、エイリアスを介して呼び出されます。このオプションは、このオプションを介して熱出力を明示的に有効にします-C
。