Zshで、変数のスコープをシェルに含めようとし、子にそれを表示させないようにしています。たとえば、これを.zshrcに入力します。
GREP_OPTIONS=--color=always
しかし、次のようにシェルスクリプトを実行すると、
#!/bin/bash
echo $GREP_OPTIONS
出力は次のとおりです。
--color=always
nullにしたいのですが(上のシェルスクリプトではGREP_OPTIONS変数がまったく表示されないはずです)。
Bashでは、次のように言うことができます:export -n GREP_OPTIONS=--color=always
、これが発生するのを防ぎます。これをzshでどのように実現しますか?
zshのexport
はtypeset -gx
の省略形です。ここで、属性g
は「グローバル」(関数に対してローカルではない)を意味し、属性x
は「エクスポートされました」(つまり、環境内)。したがって:
typeset +x GREP_OPTIONS
これはkshとbashでも機能します。
最初にGREP_OPTIONS
をエクスポートしたことがない場合は、エクスポートを解除する必要はありません。
変数を設定解除すると、エクスポートが解除されるという、間接的で移植可能な方法を使用することもできます。 ksh/bash/zshでは、変数が読み取り専用の場合、これは機能しません。
tmp=$GREP_OPTIONS
unset GREP_OPTIONS
GREP_OPTIONS=$tmp
匿名関数を使用して、変数のスコープを提供できます。 man zshall
から:
ANONYMOUS FUNCTIONS
If no name is given for a function, it is `anonymous' and is handled
specially. Either form of function definition may be used: a `()' with
no preceding name, or a `function' with an immediately following open
brace. The function is executed immediately at the point of definition
and is not stored for future use. The function name is set to
`(anon)'.
Arguments to the function may be specified as words following the clos‐
ing brace defining the function, hence if there are none no arguments
(other than $0) are set. This is a difference from the way other func‐
tions are parsed: normal function definitions may be followed by cer‐
tain keywords such as `else' or `fi', which will be treated as argu‐
ments to anonymous functions, so that a newline or semicolon is needed
to force keyword interpretation.
Note also that the argument list of any enclosing script or function is
hidden (as would be the case for any other function called at this
point).
Redirections may be applied to the anonymous function in the same man‐
ner as to a current-Shell structure enclosed in braces. The main use
of anonymous functions is to provide a scope for local variables. This
is particularly convenient in start-up files as these do not provide
their own local variable scope.
For example,
variable=outside
function {
local variable=inside
print "I am $variable with arguments $*"
} this and that
print "I am $variable"
outputs the following:
I am inside with arguments this and that
I am outside
Note that function definitions with arguments that expand to nothing,
for example `name=; function $name { ... }', are not treated as anony‐
mous functions. Instead, they are treated as normal function defini‐
tions where the definition is silently discarded.
ただし、それとは別に、.zshrc
でexport
をまったく使用しない場合、変数は現在のインタラクティブセッションでのみ表示され、サブシェルにエクスポートされるべきではありません。
Terdonがコメントで説明したように、bash
のexport -n
は、変数から「export」プロパティを削除するだけなので、export -n GREP_OPTIONS=--color=always
を使用することは、exportをまったく使用しないことと同等です-GREP_OPTIONS=--color=always
。
つまり、目的の動作を得るには、export
を使用しないでください。代わりに、.zshrc
では、
GREP_OPTIONS=--color=always
これにより、実行するすべての(対話式、非ログイン)シェルで変数を使用できるようになりますが、子シェルにはエクスポートされません。