Các biến cục bộ trong zsh: tương đương với xuất khẩu -n-băm của bash trong zsh


10

Tôi đang cố gắng để chứa phạm vi của một biến thành một vỏ và không có con nào nhìn thấy nó, trong zsh. Ví dụ: tôi nhập cái này vào .zshrc:

GREP_OPTIONS=--color=always

Nhưng nếu tôi chạy một kịch bản shell với các mục sau:

#!/bin/bash
echo $GREP_OPTIONS

Đầu ra là:

--color=always

trong khi tôi muốn nó là null (tập lệnh shell ở trên không nên thấy biến GREP_OPTIONS).

Trong bash, người ta có thể nói : export -n GREP_OPTIONS=--color=always, điều này sẽ ngăn điều này xảy ra. Làm thế nào để tôi thực hiện điều này trong zsh?


1
export -nchỉ cần xuất khẩu một biến xuất khẩu.
terdon

Câu trả lời:


11

exporttrong zsh là viết tắt của typeset -gx, trong đó thuộc tính gcó nghĩa là toàn cầu, (trái ngược với chức năng cục bộ) và thuộc tính xcó nghĩa là xuất khẩu ra (tức là trong môi trường). Như vậy:

typeset +x GREP_OPTIONS

Điều này cũng hoạt động trong ksh và bash.

Nếu bạn không bao giờ xuất GREP_OPTIONSở nơi đầu tiên, bạn không cần phải giải phóng nó.

Bạn cũng có thể sử dụng cách gián tiếp, di động: bỏ đặt một biến không thể hiện nó. Trong ksh / bash / zsh, điều này không hoạt động nếu biến chỉ đọc.

tmp=$GREP_OPTIONS
unset GREP_OPTIONS
GREP_OPTIONS=$tmp

Xem thêm env -u GREP_OPTIONS your-scriptvới một số envtriển khai (bất kỳ shell). Hoặc(unset GREP_OPTIONS; exec your-script)
Stéphane Chazelas

Tôi đã thử loại + x, nhưng điều đó cũng không tạo ra sự khác biệt. Như thể hiện trong câu hỏi của tôi, một cái gì đó đang xuất tất cả các biến tôi xác định, ngay cả khi tôi không bao gồm "xuất". Vẫn đang cố gắng tìm hiểu tại sao.
PonyEars

@redstreet Có lẽ bạn vô tình đặt tùy chọn export_all( -a)? Nhưng ngay cả sau đó typeset +x GREP_OPTIONSsẽ không thể hiện được các biến. Nếu bạn không thể tìm thấy những gì sai, hãy thử tìm kiếm nhị phân: sao lưu của bạn .zshrc, loại bỏ nửa thứ hai, xem nếu vấn đề vẫn phát sinh, sau đó nối thêm quý thứ ba hoặc cắt giảm sang quý đầu tiên và lặp lại.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles Cảm ơn, tôi đã tìm thấy nó: zsh có một tùy chọn "allexport" mà tôi có trong .zshrc của mình. 'setopt noallexport' có thể tắt tạm thời nếu nó giúp được ai khác. Tôi sẽ chấp nhận câu trả lời của bạn vì nó đến gần nhất.
PonyEars

Bây giờ tôi có một vấn đề khác, gần với vấn đề tôi đang cố gắng giải quyết, tại đây: unix.stackexchange.com/questions/113645/ Kẻ
PonyEars

6

Bạn có thể sử dụng hàm ẩn danh để cung cấp phạm vi cho biến. Từ 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.

Nhưng ngoài việc đó - nếu bạn không sử dụng exporttrong của bạn .zshrcở tất cả, biến chỉ nên được hiển thị trong phiên tương tác hiện tại của bạn, và nó không nên được xuất khẩu sang subshells.

Như terdon giải thích trong bình luận của ông: export -ntrong bashchỉ làm cho "xuất khẩu" bất động sản phải được loại bỏ từ biến, vì vậy sử dụng export -n GREP_OPTIONS=--color=alwayslà tương đương với không sử dụng xuất khẩu ở tất cả - GREP_OPTIONS=--color=always.

Nói cách khác, để có được hành vi mong muốn, chỉ cần không sử dụng export. Thay vào đó, trong bạn .zshrc, bạn nên có

GREP_OPTIONS=--color=always

Điều đó sẽ làm cho biến có sẵn cho tất cả các shell (tương tác, không đăng nhập) mà bạn chạy, giống như bạn muốn, nhưng nó sẽ không được xuất sang shell con.


Chỉ cần có GREP_OPTIONS = - color = always "là những gì tôi đang làm, như thể hiện trong câu hỏi của tôi. Một cái gì đó khác trong zsh đang khiến tất cả các biến của tôi được xuất tự động. Vẫn đang cố gắng tìm hiểu xem đó là gì.
PonyEars
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.