ls는 grml의 zsh 구성을 사용하여 grep으로 파이프하는 경우에도 여러 열을 출력합니다.

ls는 grml의 zsh 구성을 사용하여 grep으로 파이프하는 경우에도 여러 열을 출력합니다.

방금 Bash에 대해 zsh를 사용하기로 결정했고 온라인에서 어떤 정보도 찾을 수 없는 몇 가지 불편한 동작에 직면했습니다.

ls | grep fooBash에서 작업을 수행하는 경우 일치하는 파일만 출력 ls되도록 한 줄에 하나의 파일만 포함하십시오 . 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.

파이프를 사용하여 다른 프로세스에 연결하는 경우 |tty stdout가 아니어야 합니다. 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.

관련 정보