이 ffmpeg 명령이 zsh가 아닌 bash에서 작동하는 이유는 무엇입니까?


17

오늘 나는 직장에서 집으로 돌아 왔고 (우분투 상자에서 bash를 실행) 사랑하는 zsh로 로컬 아치 상자에서 코드를 실행하려고했는데 명령이 실패 했습니까?

명령은 개인 정보와 함께 아래에 있으며 ip는 분명히 변경되었습니다.

ffmpeg -i rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264  -threads 3 -vcodec copy -f segment -segment_time 2 outfiles/cam_out%04d.mp4

bash에서 완벽하게 실행되지만 zsh에서 실행할 때 오류가 발생합니다.

zsh: no matches found: rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264

내 사랑하는 zsh가 왜 나를 배신 했습니까?


7
rtsp 링크를 작은 따옴표로 묶으십시오.
jimmij

1
당신은 내 영웅입니다 :) 나는 zsh 날 실망시키지 않을 것을 알고 있었다.
John Allard

1
후에 시도 mkdir -p 'rtsp://user:pass@my.webserver.org:5554/my-media/media.amp-videocodec=h264'하면 bash와 zsh가 모두 실패합니다. 적어도 zsh는 여기에 실수를 보여줍니다.
Stéphane Chazelas

@cuonglm, 패턴과 일치하는 파일이 있으면 zsh와 bash가 모두 "실패"하여 glob가 확장됩니다. zsh의 동작은 일치하지 않을 때 실수를 깨닫게한다는 점에서 더 안전합니다.
Stéphane Chazelas

답변:


43

문자열에서 :

rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264

당신은 ?쉘이 수행 할 수 있도록, 해당 문자열에서 경로 확장을 사용하여, 해당 문자열에서 패턴 매칭 규칙을.

에서 옵션이 설정되지 않은 bash경우 ( failglob기본값) 실패한 패턴은 그대로 유지됩니다.

$ echo does-not-exist?
does-not-exist?

옵션 세트 zsh와 함께 패턴 일치 오류가 없음을보고 하지만 nomatch기본값은 다음과 같습니다.

$ echo does-not-exist?
zsh: no matches found: does-not-exist?

zsh오류 를 억제하고 패턴을 인쇄 할 수 있습니다 .

$ setopt nonomatch
$ echo does-not-exist?
does-not-exist?

당신이 할 수 bash처럼 행동을 zshnomatch설정하여 옵션 설정 failglob:

$ shopt -s failglob
$ echo does-not-exist?
bash: no match: does-not-exist?

보다 일반적으로 쉘 파일 이름 생성을 비활성화 할 수 있습니다.

$ set -f
$ : "The command"
$ set +f

(또는 set -o noglob, set +o noglob)

또는 쉘 인용 방법 중 하나 를 사용하여 쉘 처리 ?및 다른 문자와 특수 문자를 문자 그대로 일치시킵니다.


zsh또한 noglob다음과 같은 간단한 명령으로 파일 이름 생성을 비활성화 하는 내장 기능 도 제공합니다 .

$ noglob echo *
*

오 와우. 그리워서 부끄러운 일인데 답장을 보내 주셔서 감사합니다.
John Allard

그러나 이제 이것은 나에게 질문합니다 : 누군가가 어떻게 고칠 것입니까? 따옴표를 사용하여? 다른 것? 지나치게 복잡한 고양이 + 서브 쉘? 이것을 좀 더 일반적이고 매우 완벽하고 정확하게 만들기 위해 답에 추가하면 좋을 것입니다.
Ismael Miguel

지금은 대단한 답변입니다! 나는 그에 따라 upvoted했습니다. 대답은 실제로 마지막 비트가 부족했습니다. 무엇이 잘못되었지만 문제는 해결되지 않았습니다. 감사합니다.
Ismael Miguel

다른 대안 : zsh에서는 명령 앞에 추가하여 현재 명령에 대해서만 글 로빙을 비활성화 할 수 있습니다 noglob. 예 noglob echo *를 들어 간단히 출력 *합니다.
wjv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.