Насколько я знаю, не существует инструмента, который делает то, что вы хотите. Следующий скрипт myprogram
должен работать:
#!/bin/bash
var="$(cat)"
md5_stdin=$(echo "$var" | md5sum | cut -d" " -f 1)
md5_file=$(md5sum myfile.txt | cut -d" " -f1)
[[ "$md5_stdin" != "$md5_file" ]] && echo "$var" > myfile.txt
Если скрипт activate
устанавливает только переменные среды, вы можете прочитать его в одной оболочке, а затем выполнить новый интерактивный экземпляр zsh.
sh -c '. /venv/bin/activate; exec zsh -i'
Оболочка-оболочка sh
может быть заменена любой оболочкой, способной анализировать /venv/bin/activate
, включая zsh
, если скрипт activate
совместим с ней.
В дополнение к переменным среды интерактивный экземпляр zsh унаследует идентификатор процесса и несколько других параметров процесса, таких как ограничения ресурсов(ulimit …
)и игнорируемые сигналы(trap '' …
). С другой стороны, настройки самой оболочки не сохраняются :переменные оболочки (var=…
, если var
не экспортированы ), параметры оболочки(set -…
или shopt …
), привязки клавиш, определения псевдонимов и функций, и т. д.
Очевидно, что это не сработает, если ваш .zshrc
переопределяет переменные окружения, установленные сценарием activate
. Это одна из причин, по которой.*shrc
файлы не должны устанавливать переменные окружения .
ZDOTDIR
Создайте (возможно временный )каталог, скажем, /venv_startup
, который содержит два файла,.zshenv и.zshrc. Файл.zshenv состоит из
source ~/.zshenv
source /venv/bin/activate
, в то время как.zshrc говорит
source ~/.zshrc
Теперь вызовите zsh через
ZDOTDIR=/venv_startup zsh
Это говорит zsh: «Вместо того, чтобы начинать с поиска файлов.zshenv и.zshrc в $HOME
, используйте файлы с этими именами в /venv_startup
». Поскольку версии в /venv_startup
в любом случае являются источниками версий в $HOME
, чистый эффект заключается в том, что оболочка будет работать
source /venv/bin/activate
между выполнением zshenv и zshrc. После этого будет обычная интерактивная сессия.