Zsh cinsinden yerel değişkenler: bash'ın zsh cinsinden “export -n” eşdeğeri nedir?


10

Ben bir kabuk için bir değişken kapsamı içermeye çalışıyorum, ve zsh çocuklar görmüyorum. Örneğin, bunu .zshrc içine yazın:

GREP_OPTIONS=--color=always

Ama ben aşağıdaki ile bir kabuk komut dosyası çalıştırırsanız:

#!/bin/bash
echo $GREP_OPTIONS

Çıktı:

--color=always

Ben null olmasını istiyorum (yukarıdaki kabuk komut dosyası hiç GREP_OPTIONS değişkeni görmemelisiniz).

Bash'da kişi şunu söyleyebilir: export -n GREP_OPTIONS=--color=alwayski bu gerçekleşmesini engelleyecektir. Bunu zsh ile nasıl başarabilirim?


1
export -ndışa aktarılan bir değişkeni dışarı çıkarır.
terdon

Yanıtlar:


11

exportzsh kısaltmasıdır typeset -gx, burada öznitelik g“global” (yerel bir işlevin aksine) xanlamına gelir ve öznitelik “dışa aktarılır” (yani çevrede) anlamına gelir. Böylece:

typeset +x GREP_OPTIONS

Bu aynı zamanda ksh ve bash'da da çalışır.

GREP_OPTIONSİlk etapta asla dışa aktarmazsanız, onu dışa aktarmanıza gerek yoktur.

Dolaylı, taşınabilir yolu da kullanabilirsiniz: bir değişkenin ayarının kaldırılması onu dışa aktarır. Ksh / bash / zsh'de, değişken salt okunursa bu çalışmaz.

tmp=$GREP_OPTIONS
unset GREP_OPTIONS
GREP_OPTIONS=$tmp

Ayrıca env -u GREP_OPTIONS your-scriptbazı envuygulamalarla (herhangi bir kabuk) bakınız. Veya(unset GREP_OPTIONS; exec your-script)
Stéphane Chazelas

Dizgi + x denedim, ama bu da bir fark yaratmıyor. Sorumda gösterildiği gibi , "dışa aktarma" içermese bile , bir şey tanımladığım tüm değişkenleri dışa aktarıyor . Hala nedenini bulmaya çalýţýyorum.
PonyEars

@redstreet Belki export_all( -a) seçeneğini yanlışlıkla ayarladınız mı? Ancak o typeset +x GREP_OPTIONSzaman bile değişkeni dışa aktarırdı. Neyin yanlış olduğunu bulamıyorsanız, ikili aramayı deneyin: yedekleyin .zshrc, ikinci yarıyı kaldırın, sorunun devam edip etmediğine bakın, sonra ya üçüncü çeyreği ekleyin ya da ilk çeyreğe kesin ve tekrarlayın.
Gilles 'SO- kötü olmayı bırak'

@Gilles Teşekkürler, buldum: zsh benim .zshrc benim vardı bir "allexport" seçeneği vardır. 'setopt noallexport' başkasına yardım ederse geçici olarak kapatabilir. En yakın geldiği için cevabını kabul edeceğim.
PonyEars

Şimdi burada çözmeye çalıştığım soruna daha yakın olan farklı bir sorunum var: unix.stackexchange.com/questions/113645/…
PonyEars

6

Değişken için bir kapsam sağlamak üzere anonim bir işlev kullanabilirsiniz. Gönderen 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.

Ama bunun dışında - Eğer kullanmıyorsanız exportsenin içinde .zshrchiç değişken yalnızca geçerli interaktif oturumda görünür olmalıdır ve altkabuklarda ihraç edilmemelidir.

Terdon onun yorumunda açıklandığı gibi: export -niçinde bashsadece bu yüzden kullanarak, "ihracat" mülkiyet değişkeninden uzaklaştırılmasına neden olmaktadır export -n GREP_OPTIONS=--color=alwayshiç ihracat kullanmayan eşdeğerdir - GREP_OPTIONS=--color=always.

Başka bir deyişle, istenen davranışı elde etmek için kullanmayın export. Bunun yerine, içinde .zshrc, müşterileri anlama

GREP_OPTIONS=--color=always

Bu, değişkeni, istediğiniz gibi çalıştırdığınız tüm (etkileşimli, giriş yapmayan) mermiler için kullanılabilir hale getirecektir, ancak alt kabuklara aktarılmayacaktır.


Sadece = GREP_OPTIONS sahip - color = always" soruma gösterildiği gibi, ne yapıyorum zsh içinde başka bir şey bütün değişkenler otomatik ihraç edilecek neden olan Still Bunun ne olduğunu bulmaya çalışıyor...
PonyEars
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.