Используйте таймеры systemd вместо cron.
Затем в вашем модуле systemd -вы можете указатьAfter=network-online.target and Wants=network-online.target
.
Переменные всегда доступны для подпроцессов -. В:
a=1
(echo "$a")
вы видите 1.
Я думаю, вы имели в виду, что вы хотите, чтобы переменная имела локальную область действия и экспортировалась в среду, чтобы они передавались как переменные среды командам, которые выполняются .Выполнение команды — это то, что стирает память процесса (, а среда — это способ сохранить некоторые данные в нем ), разветвление дочернего процесса копирует всю память, поэтому все сохраняется.
Для этого вы можете использоватьlocal -x
:
a=(1 2)
f() {
local -x a=3
typeset -p a
printenv a # printenv being *executed*
}
f
typeset -p a
дает:
typeset -x a=3
3
typeset -a a=( 1 2 )
Или вы можете export
после объявленияlocal
:
a=(1 2)
f() {
local a=3
export a
typeset -p a
printenv a # printenv being *executed*
}
f
typeset -p a
Обратите внимание, что вы можете передать переменную в среде одной команды, не определяя ее иначе как переменную оболочки с помощью:
a=(1 2)
f() {
a=3 printenv a # printenv being *executed*
}
f
typeset -p a
Обратите внимание, что local
появился в оболочке Almquist в конце 80-х, но работает иначе, чем zsh
. В оболочке Almquist (и ее потомках, таких как dash и sh в NetBSD/FreeBSD ), local
влияет только на область действия переменной и не изменяет значение или атрибуты переменной.
zsh local
работает больше как ksh93 typeset
в том смысле, что объявляет совершенно новую переменную, независимую от переменной во внешней области видимости.
ksh88, bash и pdksh local
/ typeset
также пытаются сделать это, но все еще наследуют некоторые атрибуты от переменной внешней области, включая атрибут export . Это изменилось в ksh93, хотя обратите внимание, что ksh93 также переключился на статическую область видимости и реализует локальную область видимости только в функциях, объявленных с синтаксисом function f {...; }
.
Предполагая, что вы хотите дать процессу переменную окружения со значением, которое может отличаться от значения переменной оболочки с тем же именем, которая может находиться в области действия оболочки в момент вызова команда:
a () {
YACY_TIMEOUT=60 yacy -r -d std
}
Это стандартный синтаксис для запуска команды и присвоения ей определенного значения переменной среды. Переменная YACY_TIMEOUT
, если она существует в той же области, что и тело функции a
, не будет изменена.
Это будет работать в любой оболочке POSIX.
Что это , а не делает, так это позволяет вам использовать YACY_TIMEOUT
с "локальным" значением внутри функции перед вызовом yacy
.
В zsh
или любой другой оболочке, которая поддерживает локальные переменные, объявленные с помощью local
, вы можете сделать
a () {
local YACY_TIMEOUT=60
YACY_TIMEOUT=$YACY_TIMEOUT yacy -r -d sth
}
Здесь YACY_TIMEOUT
будет локальным по отношению к функции a
. Внедрение переменной в качестве переменной среды в процесс yacy
происходит так же, как и в первом приведенном мной примере, путем предшествующего вызова присваивания.
Теперь YACY_TIMEOUT
является одновременно локальным и доступным в среде процесса yacy
. Это будет работать в любой оболочке, поддерживающей использование local
для объявления локальных переменных.
Использовать подоболочку:
function a() (
export YACY_TIMEOUT=60
yacy -r -d sth
)
Пример:
% a () ( TIMEOUT=60; env | grep TIMEOUT )
% export TIMEOUT=4
% echo $TIMEOUT
4
% a
TIMEOUT=60
% echo $TIMEOUT
4