mpv
네트워크 스트림으로 재생할 URL을 전달하려고 합니다 .
bash
이는 다음 구문을 사용하여 수행할 수 있습니다.
$ mpv http://myvideosite.com
그러나 zsh
URL이 (대략) 파일 경로로 평가되기를 원합니다. 달리기
% mpv http://myvideosite.com
다음과 같은 응답을 받았습니다:
zsh: no matches found: http://myvideosite.com
반환 코드는 1입니다.
달리기
% mpv "http://myvideosite.com"
예상대로 수행됩니다.
zsh
매개변수를 문자열로 처리 하지 않습니까 ?
답변1
명령줄의 중요한 부분을 실수로 제거했다고 가정합니다. 문제의 URL에 ?
문자( 또는 *
)가 포함되어 있습니다. 쉘에 대한 특수 전역 일치 문자입니다 ?
. 파일 이름의 단일 문자와 일치하고 여러 문자와 일치합니다. 다음과 같이 말할 때 :*
?
*
zsh
zsh: no matches found: http://myvideosite.com?video=123
http://myvideosite.com?video=123
현재 디렉터리에 접근 가능한 파일이 없다는 메시지가 나타납니다.
zsh에서는 이와 같은 확장 실패는 기본적으로 오류이지만 Bash에서는 그렇지 않습니다. 실패한 모드는 작성된 그대로 인수로만 유지됩니다. zsh의 동작은 파일이 없기 때문에 의도한 대로 비밀리에 수행하지 않는 명령을 작성할 수 없다는 점에서 더 안전하지만 원하는 경우 Bash 동작을 갖도록 변경할 수 있습니다.
setopt nonomatch
이것NOMATCH
옵션은 기본적으로 켜져 있습니다., 표시되는 오류가 발생합니다. 비활성화하면 setopt nonomatch
실패한 전역 확장이 명령줄에서 변경되지 않은 상태로 유지됩니다.
$ echo foo?bar
zsh: no matches found: foo?bar
$ setopt nonomatch
$ echo foo?bar
foo?bar
이렇게 하면 원래 사용 사례가 해결됩니다. 일반적으로 오류를 피하기 위해 매개변수를 특수 문자로 인용하는 것이 더 좋습니다. 즉, 파일이 해당 이름으로 존재하거나 존재한다고 생각할 때 존재하지 않는 경우가 있습니다.