최근에 bash에서 zsh로 전환했는데 지금 입력하면
ls *
단순히 디렉토리의 모든 파일을 나열하는 것이 아니라 2단계 트리를 표시합니다.
반품
rm -rf somepath/*
출력 실패zsh: no matches found:
이것은 bash에서 잘 작동했습니다. 누구든지 이 동작을 복원하도록 도와줄 수 있나요?
oh-my-zsh를 설치했습니다.
답변1
ls *
Bash에서도 동일한 효과가 발생합니다. 쉘에 관계없이 쉘은 먼저 와일드카드를 확장한 다음 확장 결과를 명령에 전달합니다. 예를 들어, 현재 디렉토리에 4개의 항목(하위 디렉토리 2개 dir1
및 dir2
, 일반 파일 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:
…
ls
Bash에서 다르게 동작하는 경우 다음 중 하나를 수행할 수 있습니다.bash 구성이 변경되었습니다.와일드카드 확장을 끄면 모든 곳에서 꺼집니다. 또는 명령의 의미를 변경하여 ls
디렉터리 목록을 표시하지 않습니다(별칭 사용 가능). 구체적으로 다음과 같은 것들이 있습니다.
alias ls='ls -d'
귀하의 경우 ~/.bashrc
귀하가 설명하는 효과를 얻을 것입니다. 이것이 당신이 하고 있는 일이라면 이 줄을 복사하면 ~/.zshrc
동일한 효과를 얻을 수 있습니다.
실제로 rm -rf somepath/*
bash와 zsh가 빈 디렉토리일 때 나타나는 효과는 somepath
완전히 다릅니다.
Bash에서 somepath/*
일치하는 파일이 없으면 bash는 명령에 와일드카드 패턴을 유지하므로 매개변수 및 rm
가 표시됩니다 . 디렉터리에 호출된 파일을 삭제하려고 시도했지만 해당 파일이 없기 때문에 이 시도는 실패합니다. 옵션을 에 전달하면 파일 누락에 대해 불평하지 않습니다.-rf
somepath/*
rm
*
somepath
-f
rm
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으로 확장됩니다.마지막 하나확실히.