Bu ffmpeg komutu neden zsh değil bash içinde çalışıyor?


17

Bugün işten eve döndüm (bir Ubuntu kutusundaki bash'ı çalıştırdım) ve sevgili zsh'ım ile yerel kemer kutumda bazı kodlar çalıştırmayı denedim ve komutlar başarısız oldu?

Kişisel bilgi ve ip açık bir şekilde değiştirilmiş komut aşağıdadır

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

Bash'da mükemmel çalışır, ancak zsh'de çalıştırdığımda hatayı alıyorum

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

Sevgili zsh'ım neden bana ihanet etti?


7
Tek tırnak içine rtsp linki koymaya çalışın.
jimmij

1
sen benim kahramanımsın :) Zsh'ın beni hayal kırıklığına uğratmayacağını biliyordum.
John Allard

1
Sonra deneyin mkdir -p 'rtsp://user:pass@my.webserver.org:5554/my-media/media.amp-videocodec=h264've sonra bash ve zsh sizi başarısız edecektir. En azından zsh burada hatanızı gösteriyor.
Stéphane Chazelas

@cuonglm, yani kalıpla eşleşen bir dosya olduğunda, hem zsh hem de bash globun genişletileceği için "başarısız" olur. zsh'ın davranışı, eşleşme olmadığında, hatanızı fark etmenizi sağlaması açısından daha akılcıdır.
Stéphane Chazelas

Yanıtlar:


43

Dizede:

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

Sahip ?kabuk gerçekleştirecek, böylece o dizede yol adı genişlemesini kullanarak, o ipe desen eşleştirme kuralları.

İçinde bash, failglobseçenekler ayarlanmadıysa, bu varsayılan değerdir, başarısız olan desen olduğu gibi bırakılacaktır:

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

Öte yandan zsh, nomatchseçenek ayarında kalıp eşleşmesi hatası bildirilmez , bu varsayılan değerdir:

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

Sen yapabilir zshhatayı bastırmak ve desen baskı:

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

Sen yapabilir bashgibi davranacaksan zshile nomatchaçarak, opsiyon seti failglob:

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

Daha genel olarak, kabuk dosya adı oluşturmayı devre dışı bırakabilirsiniz:

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

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

veya kabuk muamelelerini ve özel karakterleri eşleştiren diğer desenleri tam anlamıyla yapmak için kabuk alıntılama yöntemlerinden birini kullanmak ?.


zshAyrıca noglobaşağıdaki basit komut için dosya adı oluşturmayı devre dışı bırakan yerleşkeyi de sağlayın :

$ noglob echo *
*

oh vay bu kaçırmış gibi utanç verici, güzel cevap için teşekkürler.
John Allard

Ama şimdi bu bana şu soruyu sorguluyor: Birisi nasıl düzeltir? Tırnak kullanarak? Başka bir şey? Aşırı karmaşık kedi + alt kabukları? Bunu cevabınıza eklediyseniz, biraz daha genel ve hala çok eksiksiz ve doğru yapmak güzel olurdu.
Ismael Miguel

Şimdi bu harika bir cevap! Buna göre oy verdim. Cevap gerçekten son parçadan yoksundu. Neyin yanlış olduğunu söylüyordu ama düzeltmeyi değil. Teşekkür ederim.
Ismael Miguel

Başka bir alternatif: zsh'de noglob, komutun başına geçerek globbing'i yalnızca geçerli komut için devre dışı bırakabilirsiniz . Örneğin noglob echo *basitçe çıktı verir *.
wjv
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.