방금 Bash에 대해 zsh를 사용하기로 결정했고 온라인에서 어떤 정보도 찾을 수 없는 몇 가지 불편한 동작에 직면했습니다.
ls | grep foo
Bash에서 작업을 수행하는 경우 일치하는 파일만 출력 ls
되도록 한 줄에 하나의 파일만 포함하십시오 . 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.
파이프를 사용하여 다른 프로세스에 연결하는 경우 |
tty stdout
가 아니어야 합니다. 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
.