引用符なしで文字列を入力できますが、引用符として解釈できるzsh関数をどのように作成できますか?

引用符なしで文字列を入力できますが、引用符として解釈できるzsh関数をどのように作成できますか?

次のように実行される関数を作成したいと思います。

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これは行く方法です。関数をそのまま定義してからaliasincludeを使用できますnoglob

downloadyoutube(){
  youtube-dl -f 'bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best' "$1"
}
alias downloadyoutube="noglob downloadyoutube"

とにかく、これらの主張で何をしようとしているのかは意味がありません。youtube-dl現在のページを読むのに何年もかかったことに暗黙的に同意してくださいman


クサラナンダが正しいことを強調したいです。

  1. 一部の特殊文字が問題になりたい場合に備えて、ここにいる'必要もありません。"
  2. ワイルドカードをオフにしてもイベント/リダイレクト文字を防ぐのに役立ちません。すべての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で予期せず発生する可能性がある中括弧拡張({...})またはサブシェル()は無効になりません。(...)

関連情報