Почему мой zsh-скрипт ничего не выводит?

Если вы собираетесь звонить mv1,4 миллиона раз, это будет медленно -никак иначе. Но вы уже знаете шаблон имен файлов, так почему бы не объединить их, вызывая несколько файлов однимmv:

for yy in {1990..2019}
do
    y=${yy#[0-9][0-9]}  # remove first two digits of year
    mv./*D??"$y" "/cygdrive/d/RAID5/RAID200/invoices/1/$yy"
done

Или, если это приводит к ошибкам «длина аргумента превышена», используйтеxargs:

for yy in {1990..2019}
do
   y=${yy#[0-9][0-9]}
   printf "%s\0"./*D??"$y" |   # NUL-delimited filenames for xargs -0
       xargs -0 -r mv -t "/cygdrive/d/RAID5/RAID200/invoices/1/$yy"
done
0
23.05.2021, 13:35
2 ответа

Есть гораздо более простой способ сделать то, что вы хотите:

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

Однако, что касается вашего основного вопроса :Когда вы делаете /bin/zsh./d-alias.sh, это не работает, потому что вы запускаете новую оболочку, в которой будет выполняться ваш скрипт. Когда вы запускаете новую оболочку из другой оболочки, новая оболочка наследует экспортированные переменные среды от исходной оболочки, но ничего больше. Кроме того, если вы запускаете новую оболочку для запуска сценария или команды (, а не просто запускаете новую оболочку ), она не считается интерактивной. Это означает, что ваш .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
1
28.07.2021, 11:30

Где определяются ваши псевдонимы?

Если вы запустите свой сценарий как./name.zsh, он запустит новую копию zsh, а не разветвленную копию вашей текущей оболочки. Новая копия zsh будет источником вашего ~/.zshrc, но не вашего ~/.zprofile или ~/.profile, поскольку это не оболочка входа в систему. Изменить :Как упоминает Кусалананда ниже, он не будет использовать ~/.zshrc для скриптов, только ~/.zshenv будет использоваться для скриптов zsh.

Каналы, циклы, $()и функции запускаются как ответвления текущей оболочки и сохраняют все псевдонимы и функции, поэтому '$ (псевдоним )' наследует текущие псевдонимы и функции, а 'zsh -c alias' - нет. Запуск сценария оболочки также всегда создавал новый процесс для сценария, как «псевдоним zsh -c», вместо того, чтобы разветвлять текущую оболочку.

Должна работать, загружая его в текущую оболочку:

../name.zsh

Если ваши псевдонимы определены в ~/.zprofile или ~/.profile,затем их следует переместить в ~/.zshrc. который используется для каждой копии zsh, а не только для входа в систему.

0
28.07.2021, 11:30

Теги

Похожие вопросы