
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*]}
$aliases
é uma tabela hash especial contendo todos os aliases. (Verhttp://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fparameter-Module)$...[(R)...]
faz umreverterpesquisa: busca todas as tuplas de valores-chave onde o valor (não a chave) corresponde à consulta. (Verhttp://zsh.sourceforge.net/Doc/Release/Parameters.html#Subscript-Flags)${(k)...}
retorna apenas ochaves(não os valores). (Verhttp://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion-Flags)
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ê .zshrc
nã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.