zargsはエイリアスを実行できますか?

zargsはエイリアスを実行できますか?

pip install -Uにエイリアスを指定しましたpi。以下を実行したいと思います。

zargs ~/scripts/python/**/requirements.txt -- pi -r

これを行う方法はありますか?

私も次の醜いオプションを試しました。

zargs ~/scripts/python/**/requirements.txt -- ${aliases[pi]} -r

しかしそれは言う(eval):2: command not found: pip install -U

私はzargsがzshに組み込まれているので、これらのことができるはずだと思います。

答え1

cshエイリアスは貧しい人の役割です。エイリアスは実際にはコマンドではなく、テキスト置換に近いです。aliases は、次のような機能が利用できない状況のハッキングツールで、機能を備えた高度なシェルで使用できます。

alias forever='while true; do'

または

alias fail='{ echo >&2 FAIL; return 1; }'

これは機能では機能しません。しかし、ここはそのうちの1つではありません。

alias pi='pip install -U'

定義しないpi 注文する、これは以下を定義します。pi ニックネーム。ここで拡張すると単純なコマンドの始まりになりますが、コマンドが必要なすべての場合にエイリアスは拡張されません。特に、ここのように関数の内部では拡張されませんzargs。 (もちろん拡張されますが、関数が呼び出されたとき)定義forever、私たちまたはfailそれ以上が役に立つかもしれないエイリアスを呼び出す代わりに)。そして、いくつかの不適切な状況(例:)では拡張されますpi() { ...; }

グローバルエイリアスは解決策ではありません。

〜の後

alias -g pi='pip install -U'

これでpi、単語が現れる場所ごとに拡張されます。たとえば。echo pipip install -U

ここでコマンドを定義するには、pi関数を使用できます。

pi() pip install -U "$@"

その人はと呼ばれますzargs

そしてあなたのものpi シンプルエイリアスでも次のことができます。

zargs ~/scripts/python/**/requirements.txt -- ${=aliases[pi]} -r

つまり、$IFS別名を定義すると -splitting が呼び出されます。それとも一歩進んでください。

zargs ~/scripts/python/**/requirements.txt -- "${(@Q)${(ze)aliases[pi]}}" -r    

z参照を考慮しながら、分割(たとえば、およびecho "foo bar"代わりechoに、および分割)、拡張を実行(たとえば、拡張)、引用符を削除すると、より多くのケースでより良い近似が得られます。"foo bar"echo"foobar"eecho $(uname)echo LinuxQ

関連情報