当前位置: 首页 > 知识库问答 >
问题:

脚本中定义的取消设置全局变量是否是良好的做法?

郁宾鸿
2023-03-14

在编写sh脚本时,在脚本末尾取消设置所有先前定义的全局变量是否被视为良好做法?

例如,如果我使用脚本执行脚本myscript。(来源)内置的,像这样

. myscript

执行脚本后,shell将使用脚本中定义的变量进行处理。这看起来真的很糟糕(尤其是被其他人使用时)。

如果可以的话,我会在sh(或bash)中完全去掉全局,但通常情况下不会,它们是最糟糕的解决方案:-)。

共有3个答案

柯瀚海
2023-03-14

不一定。

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

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

尉迟德惠
2023-03-14

在编写sh脚本时,在脚本末尾取消设置所有先前定义的全局变量是否被视为良好做法?

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

例如,如果我使用执行脚本myscript 源代码)内置,如下所示

. myscript

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

任何源代码脚本都需要有一个很好的源代码理由(设置特定的环境变量或更改目录是常见的原因)。其他人将要使用的任何这样的脚本都应该热衷于取消设置它附带设置的任何变量,首先要小心使用命名不同的变量,并在完成时取消所有变量的设置。

或者,至少,如果其他人的脚本在我的shell中堆满了变量,我就不会为其提供源代码。我不经常在“profile”操作之外生成源文件,但当我这样做时,脚本设计用于设置某些变量。它可以设置这些(如果不设置,则不会有用);但最好不要随机添加其他变量。如果有必要,我会复制另一个人的脚本并对其进行消毒以供自己使用,或者用消毒脚本将其包装起来。

我有一个用于设置路径的脚本(所以它或多或少都需要源代码才能有用)。它开始于:

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的新值。当您只需要设置单个变量时,这是一个可行的设计。如果您需要设置一组环境变量(例如,配置环境以使用特定的数据库管理系统),这就不太可行了。

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

姚航
2023-03-14

这并不是真正执行脚本。它是源代码,这使得shell执行脚本中的每个命令。如果要执行脚本,请执行以下操作:

./myscript

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

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

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

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

 类似资料:
  • 问题内容: function foo () { global $var; // rest of code } 在我的小型PHP项目中,我通常采用过程方式。通常,我有一个包含系统配置的变量,当我需要在函数中访问此变量时,我会这样做。 这是不好的做法吗? 问题答案: 当人们谈论其他语言的全局变量时,这意味着与PHP中的操作有所不同。那是因为变量在PHP 中并不是 真正的 全局变量。典型的PHP程序的范

  • 问题内容: 过去,我使用以下方法读取大量代码: 这样做是惯例吗? 优点和缺点是什么? 在我看来,这就像完成异常的“ Agent Orange”方式 编辑 处理方法中的预期异常 引发意外异常(一对一) 不在乎错误 那是路要走吗? 问题答案: 你不应该扔。这就是为什么。 Throwable是可抛出的事物层次结构的顶部,由and组成。由于根据定义是由不可挽救的条件引起的,因此将它们包括在方法声明中是没有

  • 问题内容: 如何在Python中的函数中声明全局变量? 也就是说,因此不必在之前声明它,而是可以在函数外部使用它。 问题答案: 是的,但是为什么?

  • 首先我想问一下这是不是可能的,设置值为全局变量在异步函数或承诺? 如果是,那么为什么每个可用的教程/网站都在教程中使用console.log(结果),但从来没有使用它将其赋值给variable。 例如:

  • 问题内容: 在此处的示例Redigo Docs forPool中,redis池在funcmain中设置为全局变量。这是一种洁净的做事方式吗?您是否应该真正在左右使用全局变量,或者是否有更好,更优选的方法来完成同一件事? 问题答案: 我看到的唯一其他解决方案例如在“将上下文传递给接口方法”中是: 创建一个接受嵌入式上下文和我们的类型的,并且由于,我们仍然满足该接口。 在您的情况下,将包括和功能。

  • 问题内容: 为什么全局变量是不好的?[closed] 问题答案: 这与Python无关。全局变量在任何编程语言中都是不好的。 但是,全局常量在概念上与全局变量并不相同。全局常数完全无害。只是在Python中没有强制性差异,只有约定是。 它们不好的原因是它们使函数具有隐藏的(非显而易见的,令人惊讶的,难以检测的)副作用,从而导致复杂性的增加,并有可能导致产生Spaghetti代码。 但是,即使在函数