為什麼我的 zsh 腳本沒有回顯任何內容?

為什麼我的 zsh 腳本沒有回顯任何內容?

腳本:

#!/bin/zsh

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

echo $arr

這兩行在普通命令列中工作:

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

但是,當這兩個命令位於腳本文件中時,它不起作用......

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

感謝您的任何幫助。非常感謝。

答案1

有一個更簡單的方法可以做你想做的事:

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

但是,對於您的主要問題:當您這樣做時/bin/zsh ./d-alias.sh,它不起作用,因為您正在啟動一個新的外殼程式來運行腳本。當您從另一個 shell 中啟動一個新 shell 時,新 shell 會繼承原始 shell 中導出的環境變量,但不會繼承任何其他內容。此外,如果您啟動新 shell 來執行腳本或命令(而不是簡單地啟動一個新 shell),則它不被視為互動式。這意味著您.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 的新副本,而不是目前 shell 的分叉副本。 zsh 的新副本將來源您的 ~/.zshrc,但不會來源您的 ~/.zprofile 或 ~/.profile,因為它不是登入 shell。編輯:正如 Kusalananda 下面提到的,它不會為腳本提供 ~/.zshrc 來源,只有 ~/.zshenv 將為 zsh 腳本提供來源。

管道、循環、$() 和函數作為當前 shell 的分支運行,並保留所有別名和函數,因此 '$(alias)' 繼承當前別名和函數,而 'zsh -c alias' 繼承當前別名和函數不是。執行 shell 腳本也總是會為腳本建立一個新進程,就像「zsh -c alias」一樣,而不是分叉目前 shell。

它應該透過將其引入當前 shell 來工作:

. ./name.zsh

如果您的別名在 ~/.zprofile 或 ~/.profile 中定義,則應將它們移至 ~/.zshrc。它源自 zsh 的每個副本,而不僅僅是登入 shell。

相關內容