zsh: Можно ли реализовать `локальный экспорт`?

Используйте таймеры systemd вместо cron.

Затем в вашем модуле systemd -вы можете указатьAfter=network-online.target and Wants=network-online.target.

3
11.08.2019, 16:17
3 ответа

Переменные всегда доступны для подпроцессов -. В:

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 {...; }.

4
27.01.2020, 21:12

Предполагая, что вы хотите дать процессу переменную окружения со значением, которое может отличаться от значения переменной оболочки с тем же именем, которая может находиться в области действия оболочки в момент вызова команда:

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для объявления локальных переменных.

2
27.01.2020, 21:12

Использовать подоболочку:

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
1
27.01.2020, 21:12

Теги

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