Dzisiaj wróciłem do domu z pracy (uruchom bash na pudełku Ubuntu) i próbowałem uruchomić kod na moim lokalnym Arch Arch z moim ukochanym Zsh, a polecenia zawiodły?
Polecenie znajduje się poniżej, a dane osobowe i adres IP zmieniły się oczywiście
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
Działa idealnie w bash, ale kiedy uruchamiam go w Zsh, pojawia się błąd
zsh: no matches found: rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264
Dlaczego mój ukochany Zsh mnie zdradził?
mkdir -p 'rtsp://user:[email protected]:5554/my-media/media.amp-videocodec=h264'
a wtedy zarówno bash, jak i zsh cię nie zawiodą. Przynajmniej zsh pokazuje ci twój błąd tutaj.Odpowiedzi:
W ciąg:
masz
?
w tym ciągu, więc powłoka wykona rozwinięcie nazwy ścieżki w tym ciągu, używając reguł dopasowania wzorca .W
bash
, jeślifailglob
opcje nie zostały ustawione, co jest ustawieniem domyślnym, nieudany wzór pozostanie niezmieniony:Chociaż
zsh
nie zgłosi błędu dopasowania wzorca przynomatch
ustawionej opcji, która jest domyślna:Możesz
zsh
usunąć błąd i wydrukować wzór:Możesz ustawić
bash
zachowanie tak, jak wzsh
przypadkunomatch
zestawu opcji, włączającfailglob
:Mówiąc bardziej ogólnie, możesz wyłączyć generowanie nazw plików powłoki:
(lub
set -o noglob
,set +o noglob
)lub używając jednej z metod cytowania powłoki , aby
?
dosłownie traktować powłokę i inne znaki specjalne pasujące do wzorca.zsh
takżenoglob
wbudowane, które wyłączają generowanie nazw plików w dowolnych słowach dla następującego prostego polecenia:źródło
noglob
polecenie. Np. Ponoglob echo *
prostu wyjdzie*
.