
腳本:
#!/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*]}
$aliases
是一個包含所有別名的特殊哈希表。 (看http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fparameter-Module)$...[(R)...]
做了一個反向尋找:它會取得值(而不是鍵)與查詢相符的所有鍵值元組。 (看http://zsh.sourceforge.net/Doc/Release/Parameters.html#Subscript-Flags)${(k)...}
僅返回鍵(不是值)。 (看http://zsh.sourceforge.net/Doc/Release/Expansion.html#Parameter-Expansion-Flags)
但是,對於您的主要問題:當您這樣做時/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。