【问题标题】:How do I define a shell script variable to have scope outside of the script如何定义 shell 脚本变量以使其具有脚本之外的范围
【发布时间】:2011-12-30 12:50:15
【问题描述】:

我正在使用 Ubuntu Natty。

我有一个已保存到 /etc/init.d/qstart 的 shell 脚本。 shell 脚本包含以下内容:

apt-get -y update
apt-get -y upgrade
apt-get -y install tofrodos gcc make nmap lsof expect sysstat
dbpass="mydbpassword"

但是,在执行脚本后,我想测试是否设置了 dbpass,并在提示符中输入 echo $dbpass。但它是空的。

如何在我的 shell 脚本中定义一个变量,以便我可以在它之外访问它?!

提前致谢。

【问题讨论】:

  • @jeromeG 我试过了,但那不起作用,当我做DBPASS="mydbpassword" 然后echo $DBPASS 时它出现了空。
  • init 脚本几乎不适合这些。您应该创建一个依赖于其他包的包,并在其 postinst 脚本中更新 /etc/environment 或类似内容。

标签: bash shell ubuntu


【解决方案1】:

您不能在父进程的环境中设置变量。您只能设置当前进程的环境或为您的进程的子进程准备环境。

也就是说,您可以指示您的 shell 从当前 shell 进程中的脚本运行命令,而不是创建一个新的 shell。你可以这样做:

source your_script.sh

. your_script.sh

(注意点后面的空格)。由于此处your_script.sh 中的命令由当前 shell 运行,因此保留了对脚本内环境所做的更改。

但是,如果运行脚本的 shell 不是您希望在其中使用环境变量的 shell 的祖先,那么使用环境变量根本无法实现您的目标。例如,如果您的脚本在初始化时由一些无子 shell 运行,那么所有完成的环境设置都将永远不可逆转地丢失。在这种情况下,请使用其他机制,例如文件(可能在 /var 下的某处)。

如果您希望给定 shell 的所有实例在其环境中设置某些变量,您可以使用大多数 shell 使用的初始化脚本。通常,它们具有系统范围和每个用户的初始化脚本。例如,bash 使用 /etc/profile 作为交互式登录 shell 的系统范围初始化脚本,使用 $HOME/.bash_profile(也称为 $HOME/.bash_login$HOME/.profile)作为每个用户的初始化脚本。有关 bash 特定的详细信息,请参阅 this reference。如果您使用不同的外壳,请尝试其各自的手册。

【讨论】:

  • 好的。我只是试图使用该脚本来为整个脚本中的 MySQL 安装定义密码。我想我将不得不另辟蹊径。
  • 如果你在调用脚本中设置了一个变量,那么被调用的脚本应该可以看到它。确保您使用export
  • 父进程确实可以设置其子进程的环境,但初始化脚本不是用户登录 shell 的父进程。
【解决方案2】:

您不能在子进程中为父进程设置环境变量。你可以做的是source script.sh. script.sh 而不是执行它,在这种情况下,它在同一个 bash 进程中执行并且所有更改都被保留。

另外,如果你想在你的初始化脚本和其他地方设置相同的变量,你可以把它放到/etc/default/something,这更常见。最后你可以把source这个文件变成bashrc或者/etc/profile.d/something文件。

【讨论】:

    猜你喜欢
    • 2015-04-18
    • 1970-01-01
    • 2012-05-05
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多