Как я могу запустить новый экземпляр zsh, который является источником определенного файла?

Насколько я знаю, не существует инструмента, который делает то, что вы хотите. Следующий скрипт 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
1
06.09.2019, 22:39
2 ответа

Если скрипт 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файлы не должны устанавливать переменные окружения .

1
27.01.2020, 23:30

Использование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. После этого будет обычная интерактивная сессия.

1
27.01.2020, 23:30

Теги

Похожие вопросы