Zsh имеет несколько исходных файлов, которые получены.Файл .zshenv
всегда создается, когда запускается оболочка, а файл .zshrc
создается только при запуске оболочки в интерактивном режиме.
Если вы определяете переменную ARDMK_DIR
с другими значениями в .zshenv
и .zshrc
, значение из .zshrc
будет использоваться при интерактивной работе с оболочкой (ввод команд, запуск Vim, ...).
Но когда Vim запускает команду, она будетзапустить неинтерактивную оболочку.В этом случае будет получен только файл .zshenv
, поэтому вы получите значение из этого файла.
Остался один вопрос:
Почему следующая команда сначала вывела правильное значение, ноmake
использует неправильно?
:setlocal makeprg=echo\ $ARDMK_DIR\ &&\ make\ -d\
Для тестирования я запустил Vim под strace
.Затем:
:set makeprg=echo\ $EDITOR
:make
В файле strace я нашел следующую строку:
execve("/usr/bin/zsh", ["/usr/bin/zsh", "-c", "echo vi 2>&1| tee /tmp/vdxR5DH/"...], [/* 86 vars */]) = 0
Как вы можете видеть, Vim выполняет echo vi
, поэтому он уже развернул переменную среды $EDITOR
к его значению перед вызовом оболочки.
Таким образом, ответ на поставленный выше вопрос состоит в том, что команда echo
повторяет текст, который Vim вставил в командную строку, в то время как команда make
получает значение переменной из среды.Поскольку это неинтерактивная оболочка, это значение из .zshenv
.