Как я могу получить постоянный dirstack с уникальными записями в zsh?

В Arch Wiki есть эта интересная конфигурация zsh:

DIRSTACKFILE="$HOME/.cache/zsh/dirs" if [[ -f $DIRSTACKFILE ]] && [[ $#dirstack -eq 0 ]]; then dirstack=( ${(f)"$(< $DIRSTACKFILE)"} ) [[ -d $dirstack[1] ]] && cd $dirstack[1] fi chpwd() { print -l $PWD ${(u)dirstack} >$DIRSTACKFILE } DIRSTACKSIZE=20 setopt autopushd pushdsilent pushdtohome ## Remove duplicate entries setopt pushdignoredups ## This reverts the +/- operators. setopt pushdminus 

Несмотря на то, что pushdignoredups установлен, я нахожу дубликаты записей в pushdignoredups dirs , иногда даже одну и ту же запись повторяется трижды. В Wiki также говорится, что это не сработает с несколькими сеансами zsh, и у меня есть несколько открытых вкладок терминала с запуском zsh, поэтому это может быть причиной проблемы.

Могу ли я каким-либо образом изменить эту функцию, чтобы сохранить только уникальные записи? Является ли это запутанным способом достижения чего-то, что zsh предоставляет более простые способы?

Как я могу иметь постоянную жертву с уникальными записями?

  • Как функция может вызвать функцию, которую она «переопределяет»?
  • tmux / zsh помещает вставленный текст
  • Переменная среды $ PATH, по-видимому, не распознается
  • Заполнение вкладки ZSH: только полные файлы, а не двоичные файлы
  • Как уменьшить влияние изменения значения массива `fpath` на время запуска zsh?
  • Если ^ a ^ b заменяет «a» один раз в последней команде, что я использую для замены всех вхождений «a»?
  • Как выполнить обратный поиск истории в vi-режиме ZSH?
  • как фильтровать по звездочке или аналогичному выражению rsync в zsh
  • One Solution collect form web for “Как я могу получить постоянный dirstack с уникальными записями в zsh?”

    Простой typeset -U dirstack терпит неудачу, поскольку dirstack , несомненно, слишком особенный для обычного уникального ограничения для применения (этот typeset очень удобен для таких вещей, как массив path ). При ближайшем рассмотрении код Arch Wiki страдает от неполной уникальности, dirstack что только dirstack только при его выписывании становится уникальным, а не с PWD и при чтении файла. Так что если PWD содержит что-то также в dirstack , будут созданы дубликаты а затем читайте. Таким образом, самым быстрым решением является применение уникального расширения для чтения:

      dirstack=( ${(uf)"$(< $DIRSTACKFILE)"} ) 

    И, возможно, также в файл напишите, что более сложно, так как ему нужна уникальная dirstack минус все, что есть в PWD плюс PWD .

     print -l $PWD ${(u)${dirstack:#$PWD}} >$DIRSTACKFILE 
    Linux и Unix - лучшая ОС в мире.