ตัวแปรโลคัลใน zsh: อะไรคือสิ่งที่เทียบเท่ากับ bash ของ“ export -n” ใน zsh


10

ฉันพยายามที่จะ จำกัด ขอบเขตของตัวแปรให้กับเชลล์และไม่มีลูกให้ดูใน zsh ตัวอย่างเช่นฉันพิมพ์สิ่งนี้ใน. zshrc:

GREP_OPTIONS=--color=always

แต่ถ้าฉันรันเชลล์สคริปต์ด้วยสิ่งต่อไปนี้:

#!/bin/bash
echo $GREP_OPTIONS

ผลลัพธ์คือ:

--color=always

ในขณะที่ฉันต้องการให้เป็นโมฆะ (เชลล์สคริปต์ด้านบนไม่ควรเห็นตัวแปร GREP_OPTIONS เลย)

ในทุบตีใครจะพูดว่า: export -n GREP_OPTIONS=--color=alwaysซึ่งจะป้องกันไม่ให้เกิดเหตุการณ์ ฉันจะทำสิ่งนี้ให้สำเร็จใน zsh ได้อย่างไร?


1
export -nเพียงยกเลิกการส่งออกตัวแปรที่ส่งออก
terdon

คำตอบ:


11

exportใน zsh เป็นการจดชวเลขtypeset -gxซึ่งแอตทริบิวต์นั้นgหมายถึง“ ทั่วโลก” (ตรงข้ามกับฟังก์ชันในท้องถิ่น) และแอตทริบิวต์นั้นxหมายถึง“ ส่งออก” (เช่นในสภาพแวดล้อม) ดังนั้น:

typeset +x GREP_OPTIONS

สิ่งนี้ยังทำงานใน ksh และทุบตี

หากคุณไม่เคยส่งออกGREP_OPTIONSเป็นครั้งแรกคุณไม่จำเป็นต้องยกเลิกการส่งออก

นอกจากนี้คุณยังสามารถใช้วิธีพกพาโดยอ้อม: การยกเลิกการยกเลิกการเอ็กซ์พอร์ตตัวแปร ใน ksh / bash / zsh สิ่งนี้จะไม่ทำงานหากตัวแปรเป็นแบบอ่านอย่างเดียว

tmp=$GREP_OPTIONS
unset GREP_OPTIONS
GREP_OPTIONS=$tmp

ดูเพิ่มเติมที่implementations env -u GREP_OPTIONS your-scriptบางตัวenv(เชลล์ใด ๆ ) หรือ(unset GREP_OPTIONS; exec your-script)
Stéphane Chazelas

ฉันลองเรียงพิมพ์ + x แต่นั่นก็ไม่ได้สร้างความแตกต่างเช่นกัน ดังที่แสดงในคำถามของฉันมีบางสิ่งกำลังส่งออกตัวแปรทั้งหมดที่ฉันกำหนดแม้ว่าฉันจะไม่รวม "ส่งออก" ยังคงพยายามหาสาเหตุ
PonyEars

@redstreet บางทีคุณอาจตั้งค่าตัวเลือกexport_all( -a) แต่ถึงอย่างนั้นก็typeset +x GREP_OPTIONSจะยกเลิกการส่งออกตัวแปร หากคุณไม่พบสิ่งที่ผิดลองค้นหาไบนารี: สำรองข้อมูล.zshrcลบครึ่งหลังดูว่าปัญหายังคงเกิดขึ้นหรือไม่จากนั้นต่อท้ายไตรมาสที่สามหรือลดลงในไตรมาสแรกและทำซ้ำ
Gilles 'หยุดชั่วร้าย'

@Gilles ขอบคุณฉันพบ: zsh มีตัวเลือก "allexport" ที่ฉันมีใน. zshrc ของฉัน 'setopt noallexport' สามารถปิดได้ชั่วคราวหากช่วยคนอื่น ฉันจะยอมรับคำตอบของคุณเพราะมันใกล้เคียงที่สุด
PonyEars

ตอนนี้ฉันมีปัญหาที่แตกต่างซึ่งใกล้เคียงกับปัญหาที่ฉันพยายามแก้ไขมากที่สุดที่นี่: 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ทุกตัวแปรควรจะมองเห็นได้ในเซสชั่นแบบโต้ตอบในปัจจุบันของคุณและมันไม่ควรจะถูกส่งออกไปยัง subshells

ในฐานะที่เป็น terdon อธิบายในความคิดเห็นของเขาexport -nในbashเพียงทำให้ทรัพย์สิน "ส่งออก" จะถูกลบออกจากตัวแปรเพื่อใช้export -n GREP_OPTIONS=--color=alwaysเทียบเท่ากับการส่งออกไม่ได้ใช้เลย GREP_OPTIONS=--color=always-

ในคำอื่น ๆ exportที่จะได้รับพฤติกรรมที่ต้องการก็ไม่ได้ใช้ ในทางกลับ.zshrcกันคุณควรมี

GREP_OPTIONS=--color=always

ซึ่งจะทำให้ตัวแปรพร้อมใช้งานสำหรับเชลล์ทั้งหมด (แบบโต้ตอบและไม่ได้ลงชื่อเข้าใช้) ที่คุณเรียกใช้เช่นเดียวกับที่คุณต้องการ แต่จะไม่ถูกส่งออกไปยังเชลล์ลูก


เพียงแค่มี GREP_OPTIONS = - color = always "คือสิ่งที่ฉันทำตามที่ปรากฏในคำถามของฉันสิ่งอื่นใน zsh ทำให้ตัวแปรทั้งหมดของฉันถูกส่งออกโดยอัตโนมัติยังคงพยายามหาว่ามันคืออะไร
PonyEars
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.