Por que esse comando ffmpeg funciona no bash e não no zsh?

17

Hoje cheguei em casa do trabalho (executei o bash em uma caixa do Ubuntu) e tentei executar algum código em minha caixa de archives local com meu amado zsh e os comandos falharam?

O comando está abaixo com as informações pessoais e o ip alterado obviamente

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

Funciona perfeitamente no bash, mas quando eu executo em zsh eu recebo o erro

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

Por que meu amado zsh me traiu?

    
por John Allard 22.03.2016 / 07:04

1 resposta

43

Na string:

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

você tem ? nessa string, então o shell executará expansão do nome do caminho nessa string, usando as regras de correspondência de padrões .

Em bash , se failglob opções não foram definidas, o que é padrão, o padrão com falha será deixado como está:

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

Embora zsh não informe nenhum erro de correspondência de padrão com nomatch conjunto de opções, que é o padrão:

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

Você pode fazer com que zsh suprima o erro e imprima o padrão:

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

Você pode fazer com que bash se comporte como zsh com nomatch conjunto de opções, ativando failglob :

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

Mais genericamente, você pode desativar a geração de nome de arquivo do shell:

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

(ou set -o noglob , set +o noglob )

ou usando um dos métodos citando do shell para fazer com que o shell trate ? e outro padrão combinando caracteres especiais literalmente.

zsh também fornece o noglob builtin, que desativa a geração de nome de arquivo em qualquer palavra para o seguinte comando simples:

$ noglob echo *
*
    
por 22.03.2016 / 07:37