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
エイリアスは貧しい人の役割です。エイリアスは実際にはコマンドではなく、テキスト置換に近いです。alias
es は、次のような機能が利用できない状況のハッキングツールで、機能を備えた高度なシェルで使用できます。
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 pi
pip 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
"foo
bar"
e
echo $(uname)
echo Linux
Q