【问题标题】:Is unsetting global variables defined in a script good practice?在脚本中定义的取消设置全局变量是好的做法吗?
【发布时间】:2012-10-11 12:00:04
【问题描述】:

在编写 sh 脚本时,在脚本末尾取消设置所有先前定义的全局变量是否被认为是一种好习惯?

例如,如果我使用 . (source) 内置的,像这样

. myscript

执行脚本后,shell 会被脚本中定义的变量污染。这看起来很糟糕(特别是如果被其他人使用)。

如果可以的话,我会完全摆脱 sh(或 bash)中的全局变量,但更多时候它们并不是最糟糕的解决方案 :-)。

【问题讨论】:

    标签: bash sh


    【解决方案1】:

    在编写 sh 脚本时,在脚本末尾取消设置所有先前定义的全局变量是否被认为是一种好习惯?

    如果脚本正常执行(在子shell中,使用myscript),那么没有理由担心脚本中定义的变量(或函数);当脚本停止执行且调用 shell 没有损坏时,它们就会消失。

    例如,如果我使用内置的 . (source) 执行我的脚本 myscript,就像这样

    . myscript
    

    执行脚本后,shell 会被脚本中定义的变量污染。这看起来很糟糕(特别是如果被其他人使用)。

    任何来源的脚本都需要有一个很好的来源(设置特定的环境变量或更改目录是通常的原因)。任何将被其他人使用的此类脚本都应该热衷于取消设置它偶然设置的任何变量,首先要小心使用具有独特名称的变量,并在完成时将它们全部取消。

    或者,至少,如果其他人的脚本在我的 shell 中乱扔变量,我不会获取它。我不经常在“配置文件”操作之外获取文件,但是当我这样做时,脚本旨在设置某些变量。它可以设置那些(如果没有它就没有用);但最好不要随机添加其他变量。如有必要,我会复制其他人的脚本并对其进行清理以供我自己使用,或者用清理脚本对其进行包装。

    我有一个用于设置 PATH 的脚本(因此它或多或少必须是有用的)。它开始了:

    ps_machine=$(uname -n)
    ps_pathset=no
    ps_pathoptsfile=
    for ps_file in \
            ${HOME}/.pathopts.$ps_machine \
            ${REAL_HOME:-$HOME}/.pathopts.$ps_machine \
            ${HOME}/.pathopts \
            ${REAL_HOME:-$HOME}/.pathopts
    do
        ...40 lines of esoteric code...
        ...some set ps_perl; some set ps_pathopts...
    done
    
    ...5 lines of active code that set PATH...
    
    unset ps_pathset ps_pathoptsfile ps_pathopts ps_file ps_perl ps_machine
    

    我将其调用为:

    . mcpathset
    

    此命令的另一种设计是:

    export PATH=$(mcpathset)
    

    在这里,命令的输出用作 PATH 的新值。当您只需要设置一个变量时,这是一个可行的设计。如果您需要设置一套环境变量(例如,将环境配置为使用特定的 DBMS),这是不太可行的。

    我不使用普通脚本来清理变量——那些不打算作为来源的。但对于可源代码脚本,我认为这很重要。我怀疑每个人都同意我的观点;许多人可能不在乎。但我同意你的看法——源代码的干净很重要。

    【讨论】:

      【解决方案2】:

      这并没有真正执行脚本。它正在采购它,这使得 shell 执行脚本中的每个命令。如果你想执行脚本,你可以这样做:

      ./myscript
      

      在这种情况下,脚本中设置的任何环境变量都不会对您的 shell 产生影响。

      如果您确实需要获取脚本的源代码,以便它可以执行设置环境变量或更改当前目录等操作,那么您可以使用括号将变量隔离在子 shell 中:

      (
        a=7
        echo $a
      )
      # The change in a doesn't get to here
      

      如果您要取消设置您使用的变量,您将遇到相反的问题。如果用户设置了一个同名的变量,那么你最终会销毁它。

      【讨论】:

        【解决方案3】:

        不一定。

        当您执行 a 脚本时,它会执行一个新的 shell,并且任何设置它的变量脚本都不会影响父 shell。

        如果您只在 shell 本身(而不是在脚本内)上执行 . myscript,那么变量集将是活动的,并且可能会像您所说的那样污染 shell。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-14
          • 1970-01-01
          • 2011-08-13
          • 1970-01-01
          • 2012-01-27
          • 2014-01-19
          相关资源
          最近更新 更多