
次のように実行される関数を作成したいと思います。
youtube-dl -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best' "https://www.youtube.com/watch?v=_OBlgSz8sSM"
現在、.zshrcで私は努力しています。
downloadyoutube(){
youtube-dl -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best' "$1"
しかし、呼び出し時にURLの周りに引用符を追加したいと思います。
代わりに走りたい
downloadyoutube https://www.youtube.com/watch?v=_OBlgSz8sSM
引用なし。
まさか
downloadyoutube "https://www.youtube.com/watch?v=_OBlgSz8sSM"
これを行う方法はありますか?
答え1
Kusalanandaが言ったように、noglob
これは行く方法です。関数をそのまま定義してからalias
includeを使用できますnoglob
。
downloadyoutube(){
youtube-dl -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best' "$1"
}
alias downloadyoutube="noglob downloadyoutube"
とにかく、これらの主張で何をしようとしているのかは意味がありません。youtube-dl
現在のページを読むのに何年もかかったことに暗黙的に同意してくださいman
。
クサラナンダが正しいことを強調したいです。
- 一部の特殊文字が問題になりたい場合に備えて、ここにいる
'
必要もありません。"
- ワイルドカードをオフにしてもイベント/リダイレクト文字を防ぐのに役立ちません。すべてのYouTube URLにその文字が含まれているため、文字列(行の末尾ではなく)に貼り付けたコンテンツを
&
自動的に置き換えるようにシェルを設定することをお勧めします。 zshはこれを自動的に行い、oh-my-zshが責任があると思います。&
\&
答え2
実際に言及していない問題は、ファイル名のzsh
ワイルドカードパターンがどの名前とも一致しない場合、デフォルトではシェルでエラーが発生することです。
$ downloadyoutube https://www.youtube.com/watch?v=_OBlgSz8sSM
zsh: no matches found: https://www.youtube.com/watch?v=_OBlgSz8sSM
ここのURLには?
ワイルドカードイン文字が含まれています。これにより、シェルはURLをパターンとして使用してファイル名の一致を求めるメッセージを表示します。一致するものがないので、シェルは文句を言い、関数呼び出しを試みません。
bash
シェルオプションが設定されていると、failglob
シェルで同様の動作が発生します。
$ shopt -s failglob
$ downloadyoutube https://www.youtube.com/watch?v=_OBlgSz8sSM
bash: no match: https://www.youtube.com/watch?v=_OBlgSz8sSM
NOGLOB
シェルオプションを設定して、シェルがURLをワイルドカードパターンとして使用するのを防ぎますsetopt NOGLOB
。を使用するまで、現在のシェルセッションでワイルドカードがオフになりますunsetopt NOGLOB
。
noglob
個々のコマンドのシェルオプションを設定する効果のある関数呼び出しの前にプレフィックスを付けることもできます。NOGLOB
noglob downloadyoutube https://www.youtube.com/watch?v=_OBlgSz8sSM
ただし、最も賢明なアプローチは、関数を呼び出すときに単一引用符を使用してURLを引用することです。次のような可能性が最も高い URLその他シェル固有の文字いいえ&
たとえば、バックグラウンドタスクを紹介するワイルドカード文字です。&
ファイル名のグロービングがオフになっても、inを含むURLはそれを引用しない限り機能しません。
ワイルドカードをオフにしてもURLで予期せず発生する可能性がある中括弧拡張({...}
)またはサブシェル()は無効になりません。(...)