zsh의 별표 "*"가 bash와 동일한 동작을 갖도록 하려면 어떻게 해야 합니까?

zsh의 별표 "*"가 bash와 동일한 동작을 갖도록 하려면 어떻게 해야 합니까?

최근에 bash에서 zsh로 전환했는데 지금 입력하면

ls *

단순히 디렉토리의 모든 파일을 나열하는 것이 아니라 2단계 트리를 표시합니다.

반품

rm -rf somepath/*

출력 실패zsh: no matches found:

이것은 bash에서 잘 작동했습니다. 누구든지 이 동작을 복원하도록 도와줄 수 있나요?

oh-my-zsh를 설치했습니다.

답변1

ls *Bash에서도 동일한 효과가 발생합니다. 쉘에 관계없이 쉘은 먼저 와일드카드를 확장한 다음 확장 결과를 명령에 전달합니다. 예를 들어, 현재 디렉토리에 4개의 항목(하위 디렉토리 2개 dir1dir2, 일반 파일 2개 file1및 ) 이 포함되어 있다고 가정합니다 file2. 그러면 쉘 ls *ls dir1 dir2 file1 file2. 이 ls명령은 먼저 기존 비디렉토리의 매개변수 이름을 나열한 다음 각 디렉토리의 내용을 차례로 나열합니다.

$ ls
dir1  dir2  file1  file2
$ ls -F
dir1/  dir2/  file1  file2
$ ls *
file1  file2

dir1:

dir2:

lsBash에서 다르게 동작하는 경우 다음 중 하나를 수행할 수 있습니다.bash 구성이 변경되었습니다.와일드카드 확장을 끄면 모든 곳에서 꺼집니다. 또는 명령의 의미를 변경하여 ls디렉터리 목록을 표시하지 않습니다(별칭 사용 가능). 구체적으로 다음과 같은 것들이 있습니다.

alias ls='ls -d'

귀하의 경우 ~/.bashrc귀하가 설명하는 효과를 얻을 것입니다. 이것이 당신이 하고 있는 일이라면 이 줄을 복사하면 ~/.zshrc동일한 효과를 얻을 수 있습니다.


실제로 rm -rf somepath/*bash와 zsh가 빈 디렉토리일 때 나타나는 효과는 somepath완전히 다릅니다.

Bash에서 somepath/*일치하는 파일이 없으면 bash는 명령에 와일드카드 패턴을 유지하므로 매개변수 및 rm가 표시됩니다 . 디렉터리에 호출된 파일을 삭제하려고 시도했지만 해당 파일이 없기 때문에 이 시도는 실패합니다. 옵션을 에 전달하면 파일 누락에 대해 불평하지 않습니다.-rfsomepath/*rm*somepath-frm

zsh에서는 기본적으로 와일드카드가 어떤 파일과도 일치하지 않으면 zsh는 이를 오류로 처리합니다. 이 옵션을 꺼서 zsh의 동작 방식을 변경할 수 있습니다nomatch:

setopt no_nomatch

와일드카드가 일치하지 않을 때 쉘이 이를 알려주도록 하는 것이 일반적으로 명령줄에서 더 나은 동작이기 때문에 이 방법을 권장하지 않습니다. 이 경우 빈 목록이 괜찮다고 zsh에 알리는 더 좋은 방법이 있습니다:

rm -rf somepath/*(N)

N글로벌 예선즉, 와일드카드가 어떤 파일과도 일치하지 않으면 빈 목록으로 확장됩니다.

답변2

기본이 아닌 옵션을 사용하여 Bourne Again 쉘을 구성했습니다 nullglob. 이는 ls *빈 디렉토리를 일반 디렉토리로 ls만들고 rm -rf somepath/*하위 디렉토리를 비어 있게 만듭니다 rm -rf.

Z 셸을 사용하여 동일한 효과를 얻으려면 동일한 이름의 유사한 기본값이 아닌 옵션이 필요합니다.

setopt 널글로브

Z 셸에는 약간 다른 동작을 활성화하는 또 다른 옵션이 있습니다.

setopt cshnullglob
이 옵션을 사용하면 ls *rm -rf somepath/*여전히 ​​일치 오류로 표시되지만 rm -rf empty/* hasfiles/*무시되지 않고 empty/*로 전달되지 않습니다 rm. 그것은 허용한다일부모드는 None으로 확장됩니다.마지막 하나확실히.

관련 정보