¿Por qué mi script zsh no hace eco de nada?

¿Por qué mi script zsh no hace eco de nada?

guion:

#!/bin/zsh

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

echo $arr

Estas dos líneas funcionan en la línea 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

Sin embargo, no funciona cuando estos dos comandos están en el archivo de script...

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

Gracias por cualquier ayuda. Muchas gracias.

Respuesta1

Hay una forma mucho más sencilla de hacer lo que quieres:

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

Sin embargo, en cuanto a su pregunta principal: cuando lo hace /bin/zsh ./d-alias.sh, no funciona porque está iniciando un nuevo shell en el que ejecutar su script. Cuando inicia un nuevo shell desde otro shell, el nuevo shell hereda las variables de entorno exportadas del shell de origen, pero nada más. Además, si inicia un nuevo shell para ejecutar un script o comando (en lugar de simplemente iniciar un nuevo shell), no se considera interactivo. Esto significa que .zshrcno obtendrá su fuente y, por lo tanto, sus alias no se inicializarán.

La solución es cargar el script como una función:

% 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

Respuesta2

¿Dónde se definen sus alias?

Si ejecuta su script como ./name.zsh, ejecutará una nueva copia de zsh en lugar de una copia bifurcada de su shell actual. La nueva copia de zsh generará su ~/.zshrc, pero no su ~/.zprofile o ~/.profile, ya que no es un shell de inicio de sesión. Editar: Como Kusalananda menciona a continuación, no obtendrá ~/.zshrc para los scripts, solo ~/.zshenv se obtendrá para los scripts zsh.

Las canalizaciones, bucles, $() y funciones se ejecutan como bifurcaciones del shell actual y conservan todos los alias y funciones, por lo que '$(alias)' hereda los alias y funciones actuales, mientras que 'zsh -c alias' sí. no. La ejecución de un script de shell también siempre creaba un nuevo proceso para el script, como 'zsh -c alias', en lugar de bifurcar el shell actual.

Debería funcionar obteniendolo en el shell actual:

. ./name.zsh

Si sus alias están definidos en ~/.zprofile o ~/.profile, entonces deben moverse a ~/.zshrc. que se obtiene para cada copia de zsh en lugar de solo un shell de inicio de sesión.

información relacionada