zshのローカル変数:zshでのbashの「エクスポート-n」に相当するもの


10

変数のスコープをシェルに含めようとしていますが、zshで子にそれを表示させません。たとえば、これを.zshrcに入力します。

GREP_OPTIONS=--color=always

しかし、次のようにシェルスクリプトを実行すると、

#!/bin/bash
echo $GREP_OPTIONS

出力は次のとおりです。

--color=always

私はそれをnullにしたいのですが(上のシェルスクリプトはGREP_OPTIONS変数をまったく見ないはずです)。

bashでは、次のように言うことができますexport -n GREP_OPTIONS=--color=always。これをzshでどのように実現しますか?


1
export -nエクスポートされた変数をアンエクスポートするだけです。
terdon

回答:


11

exportzsh typeset -gxでは、はの省略形です。属性gは「グローバル」(関数に対してローカルではない)をx意味し、属性は「エクスポートされた」(つまり、環境内)を意味します。したがって:

typeset +x GREP_OPTIONS

これはkshとbashでも機能します。

エクスポートたことがない場合はGREP_OPTIONS最初の場所で、あなたはそれをアンエクスポートする必要はありません。

変数を設定解除すると、エクスポートが解除されるという、間接的で移植可能な方法を使用することもできます。ksh / bash / zshでは、変数が読み取り専用の場合、これは機能しません。

tmp=$GREP_OPTIONS
unset GREP_OPTIONS
GREP_OPTIONS=$tmp

env -u GREP_OPTIONS your-scriptいくつかのenv実装(シェル)についても参照してください。それとも(unset GREP_OPTIONS; exec your-script)
ステファンChazelas

タイプセット+ xを試しましたが、それでも違いはありません。私の質問に示されているように、「export」を含めなくても、何かが定義するすべての変数をエクスポートしています。まだ理由を見つけようとしています。
PonyEars 2014

@redstreet export_all-a)オプションを誤って設定したのでしょうか?しかし、それでもtypeset +x GREP_OPTIONS変数はエクスポートされません。問題が見つからない場合は、バイナリ検索を試してください。をバックアップし、.zshrc後半を削除して、問題が引き続き発生するかどうかを確認してから、第3四半期を追加するか、第1四半期に切り下げて繰り返します。
Gilles 'SO-悪をやめる'

@ギレスありがとう、見つけました。zshには、.zshrcにある「allexport」オプションがあります。'setopt noallexport'は、誰かを助ける場合、一時的にオフにすることができます。一番近いのでお答えします。
PonyEars 2014

今、私はここで、解決しようとしている問題に近い別の問題を、持っている:unix.stackexchange.com/questions/113645/...
PonyEars

6

匿名関数を使用して、変数のスコープを提供できます。から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.

しかし、それとは別に-でまったく使用exportしていない場合.zshrc、変数は現在のインタラクティブセッションでのみ表示され、サブシェルにエクスポートされるべきではありません。

terdonが彼のコメントで説明したように:export -nin bashは「export」プロパティを変数から削除するだけなので、export -n GREP_OPTIONS=--color=alwaysexportをまったく使用しないのと同じGREP_OPTIONS=--color=alwaysです- 。

つまり、目的の動作を得るには、を使用しないでくださいexport。代わりに、あなたには.zshrc、あなたが持っている必要があります

GREP_OPTIONS=--color=always

これにより、実行するすべての(対話式、非ログイン)シェルで変数を使用できるようになりますが、子シェルにはエクスポートされません。


ただ、GREP_OPTIONSを持つ= -色は=常に」私の質問のように、私がやっているものですzshの中に何か他のものはすべて私の変数が自動的にエクスポートすることが原因とされてまだそれが何であるかを見つけることを試みる。。。
PonyEars
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.