Выполнение zsh rehash после сборки

У меня есть скрипт сборки, который может изменить, какие двоичные файлы находятся в моей переменной $ PATH (он не редактирует $ PATH сам, но добавляет / удаляет файлы в папки, которые уже находятся в $ PATH). Автозаполнение zsh не обновляется, чтобы отражать файлы, которые были добавлены / удалены в ответ на сборку, поэтому мне нужно либо перезапустить оболочку, либо выполнить встроенную оболочку «rehash», чтобы сообщить ей обновить свой автозаполненный кеш.

Я решил, что хочу автоматизировать перепрограммирование, поэтому сначала я сделал это:

build() { ~/bin/real_build && rehash } 

Но функции оболочки выполняются в их собственной подоболочке, поэтому перефразировка будет обновлять кеш для подоболочки, а не оболочку в терминале, который я использовал. Поэтому я переключился на это:

 alias build='~/bin/real_build && rehash' 

Это работает, за исключением случаев, когда я хочу передать аргументы для сборки. Если я передам «чистый», я бы хотел, чтобы он выполнялся:

 ~/bin/real_build clean && rehash 

Но вместо этого он будет делать:

 ~/bin/real_build && rehash clean 

Поэтому я застрял – я могу использовать псевдоним и не иметь возможности передавать аргументы, или я могу использовать функцию и не иметь ее на самом деле обновлять записи автозаполнения. Есть ли способ заставить обе работать?

2 Solutions collect form web for “Выполнение zsh rehash после сборки”

Функции оболочки не запускаются в их собственной подоболочке, если вы не используете круглые скобки вместо обычных фигурных скобок вокруг тела. Ваша функция обновляет исполняемый хэш на каждой версии zsh, которую я видел, и я не думаю, что есть возможность изменить это поведение.

Я думаю, что source может быть лучший вариант здесь. Вот пример:

 cat << EOF > foo touch $1 chmod +x $1 rehash EOF 

Выполнить foo следующим образом:

 source foo bar 

Если это было на вашем пути, bar теперь завершена.

  • Выберите текст в терминале urxvt с помощью Shift + Arrow или Ctrl + Shift + Arrow
  • в zsh, как скрыть обратную косую черту в меню завершения
  • Сильная команда таймаута в zsh
  • ZSH: `ls * (.)` Перечисляет только обычные файлы, но `ls * (/)` не перечисляет только каталоги
  • Как отключить «auto cd» в zsh с помощью oh-my-zsh
  • Тестирование LS_COLORS в zsh
  • Предупреждение о записи во время ввода сообщения zsh
  • Отменить завершение, но только завершение, в zsh
  • ZSH, конкатенация передается аргументами в одну строку
  • Как я могу перечислить все переменные оболочки?
  • Как псевдоним команды с '
  • Linux и Unix - лучшая ОС в мире.