Warum gibt mein Zsh-Skript nichts aus?

Warum gibt mein Zsh-Skript nichts aus?

Skript:

#!/bin/zsh

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

echo $arr

Diese beiden Zeilen funktionieren in der normalen Befehlszeile:

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

Es funktioniert jedoch nicht, wenn diese beiden Befehle in der Skriptdatei enthalten sind ...

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

Vielen Dank für jede Hilfe.

Antwort1

Es gibt einen viel einfacheren Weg, das zu tun, was Sie wollen:

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

Zu Ihrer Hauptfrage: Wenn Sie dies tun /bin/zsh ./d-alias.sh, funktioniert es nicht, da Sie eine neue Shell starten, in der Sie Ihr Skript ausführen. Wenn Sie eine neue Shell aus einer anderen Shell heraus starten, erbt die neue Shell die exportierten Umgebungsvariablen von der ursprünglichen Shell, aber sonst nichts. Wenn Sie außerdem eine neue Shell starten, um ein Skript oder einen Befehl auszuführen (im Gegensatz zum einfachen Starten einer neuen Shell), wird dies nicht als interaktiv betrachtet. Dies bedeutet, dass Sie .zshrckeine Quellen erhalten und Ihre Aliase daher nicht initialisiert werden.

Die Lösung besteht darin, Ihr Skript stattdessen als Funktion zu laden:

% 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

Antwort2

Wo werden Ihre Aliase definiert?

Wenn Sie Ihr Skript als ./name.zsh ausführen, wird eine neue Kopie von zsh ausgeführt und nicht eine gegabelte Kopie Ihrer aktuellen Shell. Die neue Kopie von zsh wird Ihre ~/.zshrc als Quelle verwenden, aber nicht Ihre ~/.zprofile oder ~/.profile, da es sich nicht um eine Login-Shell handelt. Bearbeiten: Wie Kusalananda unten erwähnt, wird ~/.zshrc nicht als Quelle für Skripte verwendet, nur ~/.zshenv wird für zsh-Skripte als Quelle verwendet.

Pipes, Loops, $() und Funktionen werden als Forks der aktuellen Shell ausgeführt und behalten alle Aliase und Funktionen bei, sodass „$(alias)“ die aktuellen Aliase und Funktionen erbt, während dies bei „zsh -c alias“ nicht der Fall ist. Beim Ausführen eines Shell-Skripts wurde auch immer ein neuer Prozess für das Skript erstellt, genau wie bei „zsh -c alias“, anstatt die aktuelle Shell zu forken.

Es sollte funktionieren, indem es in die aktuelle Shell eingebunden wird:

. ./name.zsh

Wenn Ihre Aliase in ~/.zprofile oder ~/.profile definiert sind, sollten sie nach ~/.zshrc verschoben werden. Dieses wird für jede Kopie von zsh und nicht nur für eine Login-Shell als Quelle verwendet.

verwandte Informationen