이 ffmpeg 명령이 bash에서는 작동하지만 zsh에서는 작동하지 않는 이유는 무엇입니까?

이 ffmpeg 명령이 bash에서는 작동하지만 zsh에서는 작동하지 않는 이유는 무엇입니까?

오늘 퇴근하고 집에 와서(Ubuntu 시스템에서 bash 실행) 제가 사랑하는 zsh를 사용하여 로컬 아치 시스템에서 일부 코드를 실행하려고 했지만 명령이 실패했습니다.

다음 명령은 개인 정보와 IP를 명백히 변경합니다.

ffmpeg -i rtsp://user:[email protected]: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:[email protected]:5554/my-media/media.amp?videocodec=h264

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

답변1

문자열에서:

rtsp://user:[email protected]:5554/my-media/media.amp?videocodec=h264

이미 ?해당 문자열에 있으므로 쉘이 실행됩니다.경로명 확장해당 문자열에서 다음을 사용하십시오.패턴 매칭규칙.

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

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

옵션 set 에 대해서는 패턴 일치 오류가 보고되지 않지만 zsh기본값은 다음과 같습니다.nomatch

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

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

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

다음을 켜서 옵션 세트 bash와 유사한 동작을 만들 수 있습니다.zshnomatchfailglob

$ 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)

또는 껍질 중 하나를 사용하십시오인용하다?문자 그대로 특수 문자를 다른 패턴과 일치시키는 쉘 핸들을 만드는 방법입니다.


zshnoglob다음과 같은 간단한 명령에 대한 파일 이름 생성을 비활성화할 수 있는 내장 함수 도 제공됩니다 .

$ noglob echo *
*

관련 정보