
сценарий:
#!/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
, это не работает, потому что вы запускаете новую оболочку, в которой запускаете свой скрипт. Когда вы запускаете новую оболочку из другой оболочки, новая оболочка наследует экспортированные переменные окружения из исходной оболочки, но ничего больше. Кроме того, если вы запускаете новую оболочку для запуска скрипта или команды (в отличие от простого запуска новой оболочки), это не считается интерактивным. Это означает, что ваш .zshrc
не будет получен sourced, и, таким образом, ваши псевдонимы не будут инициализированы.
Решение — загрузить скрипт как функцию:
% 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, а не форкнутую копию вашей текущей оболочки. Новая копия zsh будет источником вашего ~/.zshrc, но не вашего ~/.zprofile или ~/.profile, поскольку это не оболочка входа. Редактировать: Как упоминает ниже Кусалананда, он не будет источником ~/.zshrc для скриптов, только ~/.zshenv будет источником для скриптов zsh.
Каналы, циклы, $() и функции запускаются как форки текущей оболочки и сохраняют все псевдонимы и функции, поэтому '$(alias)' наследует текущие псевдонимы и функции, а 'zsh -c alias' — нет. Запуск скрипта оболочки также всегда создавал новый процесс для скрипта, как и 'zsh -c alias', вместо форка текущей оболочки.
Это должно работать, если подключить его к текущей оболочке:
. ./name.zsh
Если ваши псевдонимы определены в ~/.zprofile или ~/.profile, то их следует переместить в ~/.zshrc., который создается для каждой копии zsh, а не только для оболочки входа.