Hoje cheguei em casa do trabalho (execute bash em uma caixa do Ubuntu) e tentei executar algum código na minha caixa de arco local com o meu amado zsh e os comandos estavam falhando?
O comando está abaixo com as informações pessoais e o ip alterado obviamente
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
Funciona perfeitamente no bash, mas quando o executo no zsh, recebo o erro
zsh: no matches found: rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264
Por que meu amado zsh me traiu?
mkdir -p 'rtsp://user:[email protected]:5554/my-media/media.amp-videocodec=h264'
e então o bash e o zsh irão falhar. Pelo menos o zsh mostra seu erro aqui.Respostas:
Na sequência:
você tem
?
nessa string, portanto o shell executará a expansão do nome do caminho nessa string, usando regras de correspondência de padrões .Em
bash
, se asfailglob
opções não foram definidas, o que é o padrão, o padrão com falha será deixado como está:While
zsh
relatará nenhum erro de correspondência de padrão com onomatch
conjunto de opções, que é o padrão:Você pode
zsh
suprimir o erro e imprimir o padrão:Você pode se
bash
comportar comozsh
com onomatch
conjunto de opções ativandofailglob
:Mais geral, você pode desativar a geração do nome de arquivo do shell:
(ou
set -o noglob
,set +o noglob
)ou usando um dos métodos de citação de shell para fazer com que o shell
?
e outros padrões correspondam a caracteres especiais literalmente.zsh
Também forneça onoglob
built-in, que desabilita a geração do nome do arquivo em qualquer palavra para o seguinte comando simples:fonte
noglob
-o ao comando. Por exemplonoglob echo *
, simplesmente produzirá*
.