私のzshスクリプトが何もエコーしないのはなぜですか? [コピー]

私のzshスクリプトが何もエコーしないのはなぜですか? [コピー]

スクリプト:

#!/bin/zsh

IFS=$'\n' arr=($(alias | grep 'git' | grep "^[g|\'g]" | sed 's/=.*//' | sed "s/'//"))

echo $arr

これらの2行は通常のコマンドラインで機能します。

~/test ·····································································································································  test-Cj2sK_tx
❮ IFS=$'\n' arr=($(alias | grep 'git' | grep "^[g|\'g]" | sed 's/=.*//' | sed "s/'//"))

~/test ·····································································································································  test-Cj2sK_tx
❯ echo $arr
g ga gaa gam gama gamc gams gamscp gap gapa gapt gau gav gb gbD gba gbd gbda gbl gbnm gbr gbs gbsb gbsg gbsr gbss gc gc!' gca gca!' gcam gcan!' gcans!' gcas gcasm gcb gcd gcf gcl gclean gcm gcmsg gcn!' gco gcount gcp gcpa gcpc gcs gcsm gd gdca gdct gdcw gds gdt gdw gf gfa gfg gfo gg gga ggpull ggpush ggsup ghh gignore gignored git-svn-dcommit-push gk gke gl glg glgg glgga glgm glgp glo glod glods glog gloga glol glola glols glp glum gm gma gmom gmt gmtvim gmum gp gpd gpf gpf!' gpoat gpristine gpsup gpu gpv gr gra grb grba grbc grbd grbi grbm grbo grbs grev grh grhh grm grmc grmv groh grrm grs grset grss grst grt gru grup grv gsb gsd gsh gsi gsps gsr gss gst gsta gstaa gstall gstc gstd gstl gstp gsts gsu gsw gswc gtl gts gtv gunignore gunwip gup gupa gupav gupv gwch gwip

しかし、これら2つのコマンドがスクリプトファイルにある場合は動作しません...

~/test ·····································································································································  test-Cj2sK_tx
❯ /bin/zsh ./d-alias.sh
# nothing here...

助けてくれてありがとう。とても感謝しています。

答え1

目的のタスクを実行するより簡単な方法があります。

print -r -- ${(k)aliases[(R)*git*]}

ただし、主な問題の場合、これを行うと、/bin/zsh ./d-alias.shスクリプトを実行するために新しいシェルを起動するため、機能しません。別のシェルで新しいシェルを起動すると、新しいシェルは元のシェルからエクスポートされた環境変数を継承しますが、他のシェルは継承しません。また、単に新しいシェルを起動するのではなく、スクリプトやコマンドを実行するために新しいシェルを起動しても、インタラクティブとは見なされません。これは.zshrcソースを取得できないため、エイリアスが初期化されないことを意味します。

解決策はスクリプトを関数としてロードすることです。

% mkdir -p ~/Functions
% print 'print -r -- ${(k)aliases[(R)$~1]}' >> ~/Functions/d-alias
% fpath+=( ~/Functions )
% autoload -Uz d-alias
% d-alias '*git*'
g ga gaa gam gama gamc gams gamscp gap gapa gapt gau gav gb gbD gba gbd gbda gbl gbnm gbr gbs gbsb gbsg gbsr gbss gc gc!' gca gca!' gcam gcan!' gcans!' gcas gcasm gcb gcd gcf gcl gclean gcm gcmsg gcn!' gco gcount gcp gcpa gcpc gcs gcsm gd gdca gdct gdcw gds gdt gdw gf gfa gfg gfo gg gga ggpull ggpush ggsup ghh gignore gignored git-svn-dcommit-push gk gke gl glg glgg glgga glgm glgp glo glod glods glog gloga glol glola glols glp glum gm gma gmom gmt gmtvim gmum gp gpd gpf gpf!' gpoat gpristine gpsup gpu gpv gr gra grb grba grbc grbd grbi grbm grbo grbs grev grh grhh grm grmc grmv groh grrm grs grset grss grst grt gru grup grv gsb gsd gsh gsi gsps gsr gss gst gsta gstaa gstall gstc gstd gstl gstp gsts gsu gsw gswc gtl gts gtv gunignore gunwip gup gupa gupav gupv gwch gwip

答え2

エイリアスはどこで定義されていますか?

./name.zsh でスクリプトを実行すると、現在のシェルの分岐コピーではなく、新しい zsh コピーが実行されます。 zsh の新しいコピーは ~/.zshrc のソースになりますが、ログインシェルではないため、 ~/.zprofile または ~/.profile のソースではありません。編集:以下に記載されているKusalalanandaのように、スクリプトに〜/ .zshrcをソースせず、〜/ .zshenvのみzshスクリプトをソースとして使用します。

パイプ、ループ、$()、関数は現在のシェルの分岐として実行され、すべてのエイリアスと関数を保持するため、 '$(alias)' は現在のエイリアスと関数を継承し、'zsh -c alias' は現在のエイリアスと関数を継承します。いいえ。また、シェルスクリプトを実行すると、現在のシェルをフォークするのではなく、常に「zsh -c alias」などのスクリプトの新しいプロセスが作成されます。

これを現在のシェルにインポートすると機能します。

. ./name.zsh

エイリアスが ~/.zprofile または ~/.profile で定義されている場合は、そのエイリアスを ~/.zshrc に移動する必要があります。これはログインシェルだけでなく、zshのすべてのコピーでも発生します。

関連情報