Почему мой скрипт 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, это не работает, потому что вы запускаете новую оболочку, в которой запускаете свой скрипт. Когда вы запускаете новую оболочку из другой оболочки, новая оболочка наследует экспортированные переменные окружения из исходной оболочки, но ничего больше. Кроме того, если вы запускаете новую оболочку для запуска скрипта или команды (в отличие от простого запуска новой оболочки), это не считается интерактивным. Это означает, что ваш .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, а не только для оболочки входа.

Связанный контент