Perché questo comando ffmpeg funziona in bash e non in zsh?


17

Oggi sono tornato a casa dal lavoro (eseguo bash su una casella Ubuntu) e ho provato a eseguire un po 'di codice sulla mia casella di arco locale con la mia amata zsh e i comandi non andavano a buon fine?

Il comando è sotto con le informazioni personali e l'ip è ovviamente cambiato

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

Funziona perfettamente in bash, ma quando lo eseguo in zsh ottengo l'errore

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

Perché il mio amato zsh mi ha tradito?


7
Prova a mettere il link rtsp tra virgolette singole.
Jimmij,

1
sei il mio eroe :) Sapevo che zsh non mi avrebbe deluso.
John Allard,

1
Prova dopo mkdir -p 'rtsp://user:pass@my.webserver.org:5554/my-media/media.amp-videocodec=h264'e poi entrambi bash e zsh non riusciranno. Almeno zsh ti mostra il tuo errore qui.
Stéphane Chazelas,

@cuonglm, intendevo dire che quando c'è un file corrispondente allo schema, sia zsh che bash "falliranno" in quanto il globo verrà espanso. Il comportamento di zsh è più sano in quanto quando non c'è corrispondenza, ti fa capire il tuo errore.
Stéphane Chazelas,

Risposte:


43

Nella stringa:

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

hai ?in quella stringa, quindi la shell eseguirà l' espansione del percorso su quella stringa, usando le regole di corrispondenza del modello .

In bash, se le failglobopzioni non sono state impostate, impostazione predefinita, il modello non riuscito verrà lasciato così com'è:

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

Mentre non zshverrà segnalato alcun errore di corrispondenza del modello con l' nomatchopzione impostata, che è l'impostazione predefinita:

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

Puoi zsheliminare l'errore e stampare il modello:

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

Puoi bashcomportarti come zshcon il nomatchset di opzioni, attivando failglob:

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

Più in generale, è possibile disabilitare la generazione del nome file della shell:

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

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

o usando uno dei metodi di quotazione della shell per rendere ?letteralmente i tratti della shell e altri pattern corrispondenti ai caratteri speciali.


zshfornisce anche il noglobbuilt-in, che disabilita la generazione del nome file in qualsiasi parola per il seguente semplice comando:

$ noglob echo *
*

oh wow è un po 'imbarazzante aver perso, grazie per la bella risposta.
John Allard,

Ma ora questo mi fa fare una domanda: come qualcuno lo risolverebbe? Usando le virgolette? Qualcos'altro? Cat + subshells troppo complicati? Sarebbe bello se lo aggiungessi alla tua risposta, per renderlo un po 'più generale e comunque molto completo e corretto.
Ismael Miguel,

Questa è una risposta fantastica! Ho votato di conseguenza. Alla risposta mancava davvero l'ultimo bit. Ha detto cosa c'è che non va ma non la soluzione. Grazie.
Ismael Miguel,

Un'altra alternativa: in zsh, è possibile disabilitare il globbing solo per il comando corrente anteponendo noglobal comando. Ad esempio, noglob echo *verrà semplicemente emesso *.
wjv,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.