Por que meu script zsh não ecoa nada?

Por que meu script zsh não ecoa nada?

roteiro:

#!/bin/zsh

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

echo $arr

Essas duas linhas funcionam na linha de comando normal:

~/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

No entanto, não funciona quando esses dois comandos estão no arquivo de script...

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

Obrigado por qualquer ajuda. Muito obrigado.

Responder1

Existe uma maneira muito mais fácil de fazer o que você deseja:

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

No entanto, quanto à sua pergunta principal: quando você faz isso /bin/zsh ./d-alias.sh, não funciona, porque você está iniciando um novo shell para executar seu script. Quando você inicia um novo shell de outro shell, o novo shell herda as variáveis ​​de ambiente exportadas do shell de origem, mas nada mais. Além disso, se você iniciar um novo shell para executar um script ou comando (em vez de simplesmente iniciar um novo shell), ele não será considerado interativo. Isso significa que você .zshrcnão será originado e, portanto, seus aliases não serão inicializados.

A solução é carregar seu script como uma função:

% 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

Responder2

Onde seus aliases estão sendo definidos?

Se você executar seu script como ./name.zsh, ele executará uma nova cópia do zsh em vez de uma cópia bifurcada do seu shell atual. A nova cópia do zsh fornecerá seu ~/.zshrc, mas não seu ~/.zprofile ou ~/.profile, já que não é um shell de login. Editar: como Kusalananda menciona abaixo, ele não fornecerá ~/.zshrc para scripts, apenas ~/.zshenv será fornecido para scripts zsh.

Pipes, loops, $() e funções são executados como bifurcações do shell atual e retêm todos os aliases e funções, então '$(alias)' herda os aliases e funções atuais, enquanto 'zsh -c alias' herda não. A execução de um script de shell também sempre criava um novo processo para o script, assim como 'zsh -c alias', em vez de bifurcar o shell atual.

Deve funcionar colocando-o no shell atual:

. ./name.zsh

Se seus aliases estiverem definidos em ~/.zprofile ou ~/.profile, eles deverão ser movidos para ~/.zshrc. que é fornecido para cada cópia do zsh em vez de apenas um shell de login.

informação relacionada