Aujourd'hui, je suis rentré du travail (exécuter bash sur une boîte Ubuntu) et j'ai essayé d'exécuter du code sur ma boîte d'archive locale avec mon bien-aimé zsh et les commandes échouaient?
La commande est ci-dessous avec les informations personnelles et l'ip changé évidemment
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
Il fonctionne parfaitement en bash, mais quand je l'exécute en zsh, j'obtiens l'erreur
zsh: no matches found: rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264
Pourquoi mon bien-aimé zsh m'a trahi?
mkdir -p 'rtsp://user:[email protected]:5554/my-media/media.amp-videocodec=h264'
et bash et zsh vous échoueront. Au moins zsh vous montre votre erreur ici.Réponses:
En chaîne:
vous avez
?
dans cette chaîne, donc le shell effectuera l' expansion du chemin d'accès sur cette chaîne, en utilisant des règles de correspondance de modèle .Dans
bash
, si lesfailglob
options n'ont pas été définies, ce qui est par défaut, le modèle échoué sera laissé tel quel:While
zsh
ne signalera aucune erreur de correspondance de modèle avec lenomatch
jeu d'options, qui est par défaut:Vous pouvez faire
zsh
supprimer l'erreur et imprimer le motif:Vous pouvez vous
bash
comporter commezsh
avec lenomatch
jeu d'options en activantfailglob
:Plus généralement, vous pouvez désactiver la génération de nom de fichier shell:
(ou
set -o noglob
,set +o noglob
)ou en utilisant l'une des méthodes de citation du shell pour que les gâteries du shell
?
et les autres motifs correspondant aux caractères spéciaux soient littéralement.zsh
fournissez également la fonctionnoglob
intégrée, qui désactive la génération de nom de fichier dans n'importe quel mot pour la commande simple suivante:la source
noglob
la commande à la commande. Par exemple,noglob echo *
affichera simplement*
.