Hari ini saya pulang kerja (jalankan bash pada kotak Ubuntu) dan mencoba menjalankan beberapa kode pada kotak lengkung lokal saya dengan zsh kesayangan saya dan perintahnya gagal?
Perintah di bawah ini dengan info pribadi dan ip berubah dengan jelas
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
Ini berjalan sempurna di bash, tetapi ketika saya menjalankannya di zsh saya mendapatkan kesalahan
zsh: no matches found: rtsp://user:pass@my.webserver.org:5554/my-media/media.amp?videocodec=h264
Mengapa zsh kesayanganku mengkhianatiku?
mkdir -p 'rtsp://user:[email protected]:5554/my-media/media.amp-videocodec=h264'
dan kemudian bash dan zsh akan mengecewakan Anda. Setidaknya zsh menunjukkan kesalahan Anda di sini.Jawaban:
Dalam string:
Anda miliki
?
di string itu, jadi shell akan melakukan ekspansi pathname pada string itu, menggunakan aturan pencocokan pola .Dalam
bash
, jikafailglob
opsi tidak disetel, yang merupakan default, maka pola yang gagal akan dibiarkan apa adanya:Sementara
zsh
akan melaporkan tidak ada kesalahan pencocokan pola dengannomatch
set opsi, yang merupakan default:Anda dapat
zsh
menekan kesalahan dan mencetak polanya:Anda dapat
bash
berperilaku sepertizsh
dengannomatch
set opsi, dengan menghidupkanfailglob
:Lebih umum, Anda dapat menonaktifkan pembuatan nama file shell:
(atau
set -o noglob
,set +o noglob
)atau menggunakan salah satu metode mengutip shell untuk membuat suguhan shell
?
dan pola lainnya cocok dengan karakter khusus secara harfiah.zsh
juga menyediakannoglob
builtin, yang menonaktifkan pembuatan nama file dalam kata apa pun untuk perintah sederhana berikut:sumber
noglob
ke perintah. Misalnyanoglob echo *
hanya akan menampilkan*
.