设置+ a不会取消设置-a标志

AJP

在Mac 10.11.6上,使用GNU bash 3.2.57(1)-发行版(x86_64-apple-darwin15),该set +a命令似乎不起作用:

script.py

#!/usr/bin/python
import os
print("VAR0 is:", os.environ.get("VAR0")

命令:

$ VAR0=abc
$ ./script.py
('VAR0 is:', None)   # expected
$ set -a
$ VAR0=abc
$ ./script.py
('VAR0 is:', 'abc')   # expected, VAR0 has been exported to the environment and script.py has access to it
$ set +a
$ VAR0=def
$ ./script.py
('VAR0 is:', 'def')   # <= unexpected
以撒

带走:是的,set +a取消设置set -a正因为如此,但出口的变量不会成为联合国。然后,每个变量都需要取消导出或取消设置。


选项allexport(与相同set -a)允许自动导出新的更改的变量。激活set -a选项之前存在的变量将不会导出。

测试前有两点:

  1. 的条件set -a可以用来打印shopt -po allexport
    并且可以通过shopt -os allexport进行更改shopt -ou allexport

    $ shopt -po allexport
    set +o allexport
    
    $ set -a
    $ shopt -po allexport
    set -o allexport
    
    $ set +a
    $ shopt -po allexport
    set +o allexport
    
  2. 壳的方式来测试环境变量是检查的输出environment命令,居然到grep

    $ env | grep PATH
    PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
    

不需要来自python的外部程序(需要在首次调用时进行编译)。如果这会让您感到高兴,您仍然可以使用它,但是并没有真正的需要。

如果未设置选项(set +a)。一个新的变量将不会被导出。

$ unset VAR0
$ VAR0=abc
$ env | grep VAR0
                      # nothing is printed.

或者,如果您仍然想要程序:

$ ./envtest.py
VAR0 is: None

如果-a更改了选项,则只有在更改后才能导出var:

$ set -a
$ shopt -po allexport
set -o allexport
$ env | grep VAR0
$ ./envtest.py
VAR0 is: None

如果变量更改:

$ VAR0=bcd
$ env | grep VAR0
VAR0=bcd
$ ./envtest.py
VAR0 is: bcd

但是,如果set +a应用,变量将保留在环境中

$ set +a
$ env | grep VAR0
VAR0=bcd
$ ./envtest.py
VAR0 is: bcd

即使var被更改,它仍然是环境的一部分:

$ VAR0=xyz
$ env | grep VAR0
VAR0=xyz
$ ./envtest.py
VAR0 is: xyz

直到取消导出(删除导出属性)为止:

$ declare +x VAR0

或者仅仅是 unset

$ env | grep VAR0
VAR0=xyz
$ unset VAR0
$ env | grep VAR0

不,分配空值是不一样的:

$ VAR0=''
$ env | grep VAR0
VAR0=

您的程序没有清楚显示以下内容:

$ ./envtest.py
VAR0 is: 

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章