なぜ私の 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 はソースしません。編集: Kusalananda が以下で述べているように、スクリプトでは ~/.zshrc はソースされず、zsh スクリプトでは ~/.zshenv のみがソースされます。

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

これを現在のシェルにソースすることで動作するはずです:

. ./name.zsh

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

関連情報