У меня есть некоторый экспорт и другие вещи, которые требуют, чтобы другая программа работала (для получения путей или безотносительно), и они занимают нетривиальное количество времени для выполнения, означая, что мое время запуска удара находится на порядке 5 секунд.
Прежде чем я уйду и включу некоторое основное кэширование мой .bashrc
, существует ли способ, которым я могу выполнить что-то асинхронно, которое позволит мне экспортировать переменные в своей рабочей оболочке?
(Так, это действительно не ограничено .bashrc
, но удар в целом.)
Много зависит от того, когда те программы должны работать и когда Вам нужны их результаты. Если не имеет значения, когда они работают (то есть, их результаты не меняются в зависимости от времени), то могло бы быть лучше сделать, чтобы они работали от Вашего ~/.profile
или ~/.bash_profile
(т.е. когда Вы входите в систему), а не от Вашего ~/.bashrc
.
Если Вы нуждаетесь в их результатах, но не можете ждать эти 5 секунд, это берет, чтобы они работали, что Вы собираетесь сделать в течение первых 5 секунд, на которые возросла Ваша оболочка? Вы не можете выполнить команды, которые зависят от выводов тех программ, потому что результаты еще не будут доступны.
Я думаю, описываете ли Вы более подробно точно, каковы требования, мы смогли давать Вам лучшие ответы.
Однако Вы могли запустить свои программы в фоновом режиме как Dennis Williamson, предложенный, и сделать, чтобы они записали свои результаты в некоторые файлы в Вашем корневом каталоге. Затем Вы могли установить переменную удара PROMPT_COMMAND
получать те файлы, из которых удар затем сделал бы перед каждым дисплеем PS1
.
Например, скажите свои записи фоновой программы export ans=42
в файл ~/answer
когда это сделано. В Вашем ~/.bashrc
, поместить
PROMPT_COMMAND=". ~/answer"
Затем каждый раз дисплеи оболочки PS1
, это сначала получит ~/answer
и Ваша среда будет в конечном счете (например, спустя 5 секунд после запуска) содержат переменную ans
со значением 42
.
Конечно, спустя первые 5 секунд после запуска оболочки, ~/answer
будет содержать значения с прошлого раза, когда Вы запустили оболочку, таким образом, необходимо будет решить, важно ли это (и как сбросить тот файл при необходимости).
Вы могли бы хотеть думать о балансировке рабочей нагрузки между Вашим профилем, который выполняется однажды, и Ваш bashrc файл, который выполняется каждый раз, когда Вы запускаете (интерактивное) удар. Я сохраняю свое bashrc минимальное - таким образом, я бужу быстрый запуск. Мой профиль не слишком плох - это сложно, но, конечно, не требуется 5 секунд.
Я не знаю ни о каком пути, который может установить переменные в фоновом режиме. Однако можно запустить скрипты в фоне, таким образом, что они работают параллельно, а не последовательно, при ловле их вывода. Это может ускорить выполнение. Можно использовать дескрипторы файлов 3-9 с этим методом для в общей сложности 7 параллельных процессов.
Чтобы быть ясными, все выполняемые команды должны закончиться прежде, чем породить интерактивную оболочку для использования их вывода в установке переменных.
Это решение просто позволяет частям сценария работать параллельно к остальной части сценария (в этом случае, .bashrc
)
function copget { read -u $1; echo "$REPLY"; }
coproc DATE { date; }
exec 3<&${DATE[0]}
coproc UNAME { uname; }
exec 4<&${UNAME[0]}
var1=$(copget 3)
exec 3>&-
var2=$(copget 4)
exec 4>&-
Можно использовать амперсанд для выполнения процесса в фоновом режиме.
some_program &
Однако программа не сможет непосредственно влиять на среду оболочки, которая запустила ее.
У Вас не должно быть продолжительных процессов в файлах запуска.