Как я могу получить постоянный 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 предоставляет более простые способы?

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

  • zch не работает корректно в Mint
  • Как остановить bash из файлов с проверкой синтаксиса?
  • Как я могу убить мой обработанный процесс yes?
  • Как выполнить команду, не сохраняя ее в истории (даже для клавиши «вверх») в zsh
  • Как изменить тему с помощью zsh
  • Выполните заданную команду на каждом подпути длинного пути
  • Вставка из буфера обмена в vi-enabled zsh или bash shell
  • Присоединение файлов на диске
  • 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 - лучшая ОС в мире.