Выполненные части .bashrc асинхронно

У меня есть некоторый экспорт и другие вещи, которые требуют, чтобы другая программа работала (для получения путей или безотносительно), и они занимают нетривиальное количество времени для выполнения, означая, что мое время запуска удара находится на порядке 5 секунд.

Прежде чем я уйду и включу некоторое основное кэширование мой .bashrc, существует ли способ, которым я могу выполнить что-то асинхронно, которое позволит мне экспортировать переменные в своей рабочей оболочке?

(Так, это действительно не ограничено .bashrc, но удар в целом.)

9
задан 20.01.2014, 18:16

4 ответа

Много зависит от того, когда те программы должны работать и когда Вам нужны их результаты. Если не имеет значения, когда они работают (то есть, их результаты не меняются в зависимости от времени), то могло бы быть лучше сделать, чтобы они работали от Вашего ~/.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 будет содержать значения с прошлого раза, когда Вы запустили оболочку, таким образом, необходимо будет решить, важно ли это (и как сбросить тот файл при необходимости).

2
ответ дан 07.12.2019, 13:36

Вы могли бы хотеть думать о балансировке рабочей нагрузки между Вашим профилем, который выполняется однажды, и Ваш bashrc файл, который выполняется каждый раз, когда Вы запускаете (интерактивное) удар. Я сохраняю свое bashrc минимальное - таким образом, я бужу быстрый запуск. Мой профиль не слишком плох - это сложно, но, конечно, не требуется 5 секунд.

1
ответ дан 07.12.2019, 13:36

Я не знаю ни о каком пути, который может установить переменные в фоновом режиме. Однако можно запустить скрипты в фоне, таким образом, что они работают параллельно, а не последовательно, при ловле их вывода. Это может ускорить выполнение. Можно использовать дескрипторы файлов 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>&-
1
ответ дан 07.12.2019, 13:36

Можно использовать амперсанд для выполнения процесса в фоновом режиме.

some_program &

Однако программа не сможет непосредственно влиять на среду оболочки, которая запустила ее.

У Вас не должно быть продолжительных процессов в файлах запуска.

0
ответ дан 07.12.2019, 13:36

Теги

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