zsh:「ローカルエクスポート」を実装できますか?

zsh:「ローカルエクスポート」を実装できますか?

local exportzshで実装できますか?おそらくtryとAlwaysを使用できますか?

これにより競合状態が発生しますか?

「ローカルエクスポート」とは、サブプロセス(範囲内)からアクセスできるローカル変数とまったく同じことを意味します。

例:

function a() {
 local export YACY_TIMEOUT=60
 yacy -r -d sth
 }
 export YACY_TIMEOUT=4
 echo "$YACY_TIMEOUT" # 4
 a
 echo "$YACY_TIMEOUT" # 4

答え1

変数は子プロセスで常に使用できます。存在する:

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

localAlmquistシェルは1980年代後半に始まりましたが、異なる動作をしますzsh。 Almquistシェル(およびNetBSD / FreeBSDのダッシュやshなどの子)では、local変数の範囲のみが影響を受け、変数の値や属性は変更されません。

zshは、外部スコープの変数とは無関係にまったく新しい変数を宣言するという点で、localksh93と同様に機能します。typeset

ksh88、bash、およびpdkshlocaltypesetこれを試みますが、まだ次のような外部スコープの変数からいくつかのプロパティを継承します。出口属性。これはksh93で変更されましたが、ksh93も静的スコープに切り替え、その構文をfunction f { ...; }使用して宣言された関数内でのみローカルスコープを実装しました。

答え2

コマンドが呼び出されたときに、シェル範囲内の同じ名前のシェル変数値と値が異なる可能性がある環境変数をプロセスに提供したいとします。

a () {
    YACY_TIMEOUT=60 yacy -r -d std
}

これは、コマンドを実行し、環境変数に特定の値を提供するための標準構文です。変数が関数YACY_TIMEOUT本体と同じ範囲内にある場合はa変更されません。

これはすべてのPOSIXシェルで機能します。

これは何のためであるか。いいえYACY_TIMEOUTdoを使用すると、関数を呼び出す前に関数内で「ローカル」値を使用できますyacy

zshまたは、次のようにローカル変数宣言をサポートするlocal他のシェルで

a () {
    local YACY_TIMEOUT=60

    YACY_TIMEOUT=$YACY_TIMEOUT yacy -r -d sth
}

これは関数のローカル関数YACY_TIMEOUTです。a環境変数としてプロセスに変数を注入することは、私が提供した最初のyacy例のように、呼び出し前に割り当てを追加することによって行われます。

NowYACY_TIMEOUTはデフォルトで、yacyプロセス環境で使用できます。これはlocal

答え3

サブシェルを使用してください:

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

関連情報