Heute bin ich von der Arbeit nach Hause gekommen (Bash auf einer Ubuntu-Box ausführen) und habe versucht, mit meinem geliebten zsh Code auf meiner lokalen Arch-Box auszuführen, und die Befehle sind fehlgeschlagen?
Der Befehl ist unten mit den persönlichen Daten und IP offensichtlich geändert
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
Es läuft perfekt in bash, aber wenn ich es in zsh laufen lasse, bekomme ich den Fehler
zsh: no matches found: rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264
Warum hat mich mein geliebter Zsh betrogen?
mkdir -p 'rtsp://user:[email protected]:5554/my-media/media.amp-videocodec=h264'
und dann schlagen sowohl bash als auch zsh fehl. Zumindest zsh zeigt dir hier deinen Fehler.Antworten:
In Zeichenfolge:
Sie haben
?
in dieser Zeichenfolge, so dass die Shell Pfadnamenerweiterungen für diese Zeichenfolge unter Verwendung von Mustervergleichsregeln ausführt .In
bash
, wennfailglob
wurde Optionen nicht gesetzt, was Standard ist, dann scheiterte Muster bleiben , wie sie ist:While
zsh
meldet keinen Musterübereinstimmungsfehler mit eingestellternomatch
Option. Dies ist die Standardeinstellung:Sie können
zsh
den Fehler unterdrücken und das Muster drucken lassen:Sie können das
bash
Verhalten wiezsh
beinomatch
Optionssätzen festlegen, indem Sie Folgendes aktivierenfailglob
:Im Allgemeinen können Sie die Generierung von Shell-Dateinamen deaktivieren:
(oder
set -o noglob
,set +o noglob
)Oder verwenden Sie eine der Shell- Anführungszeichen- Methoden, um die Shell-Leckerchen
?
und andere Muster mit Sonderzeichen buchstäblich abzugleichen.zsh
noglob
Geben Sie außerdem das integrierte Element an, mit dem die Generierung von Dateinamen in beliebigen Worten für den folgenden einfachen Befehl deaktiviert wird:quelle
noglob
dem Befehl voranstellen . ZBnoglob echo *
wird einfach ausgegeben*
.