如何判断变量是否在 zsh(或 bash)中导出?

How can I tell if a variable was exported or not in zsh (or bash)?

提问人:JL Peyret 提问时间:8/4/2023 最后编辑:JL Peyret 更新时间:8/4/2023 访问量:124

问:

在终端上,我怎样才能轻松区分

  1. 一个 shell 变量:foo=foovalue

  1. 导出的环境变量: ,可由子进程使用吗?export bar=barvalue

我知道并命令。 报告这两种情况,但没有说明哪个是哪个。 不报告 1)。setenvsetenv

示例终端会话

(在 ZSH + macOS 上,但这应该无关紧要):

$foo=foovalue           
$export bar=barvalue    

$set | egrep "^foo|^bar"
bar=barvalue
foo=foovalue

$env | egrep "^foo|^bar"
bar=barvalue

有什么方法可以同时看到 和 ,但也表明这是一个仅限 bash 的变量,对 Python 或 Ruby 脚本等子进程不可见?通常,当我的脚本没有看到我所期望的内容时,我最终会做的是 greping 我的 shell 脚本并查找变量的定义位置。它有效,但充其量是笨拙的。foobarfoo

bash 变量 环境变量 zsh

评论

2赞 Charles Duffy 8/4/2023
declare -p foo bar,并查看输出是否显示 或declare --declare -x
0赞 Kaz 8/4/2023
如果您希望变量导出它,则 ,并且您知道它已导出。如果你不把针锋相对地出口,然后你就知道了。export fooexport -n foo
0赞 Charles Duffy 8/4/2023
...还有一个 bash 5.0 功能可以让你检索标志;你的目标是哪个版本的 Bash?
0赞 Charles Duffy 8/4/2023
(请注意,我正在考虑的功能特定于 bash 的,不适用于 zsh;zsh 不是 bash,也不与 bash 兼容,关于 zsh 的问题不应该在任何地方说“bash”)。
1赞 user1934428 8/4/2023
@JLPeyret : 同时拥有 bash 和 zsh 标签是个坏主意。如果你得到一个精彩的 bash 答案,而另一个精彩的 zsh 答案,你会怎么做?你会接受其中的哪一个?

答:

0赞 Bhagyashri patil 8/4/2023 #1
variable_name="some value"
export variable_name

检查变量是否已导出:

declare -p variable_name | grep -q 'declare -x'
if [ $? -eq 0 ]; then
  echo "The variable was exported."
else
  echo "The variable was not exported."
fi

评论

1赞 Charles Duffy 8/4/2023
为什么检查$?来查看命令是否成功是反模式?-- 最好运行并避免额外的步骤。if declare -p variable_name | grep -q 'declare -x'; then[
1赞 Charles Duffy 8/4/2023
...也就是说,OP 似乎实际上运行的是 zsh,而不是 bash,它可以输出命令并且根本不匹配模式。declare -ptypesetdeclare -x
0赞 Charles Duffy 8/4/2023
此外,请考虑上述代码失败的情况。unexported_var='declare -x'
3赞 iBug 8/4/2023 #2

使用并检查输出。例如:declare -p

declare -- BASH="/bin/bash"
declare -x EDITOR="vim"

哪个是导出的,哪个是不导出的,这是显而易见的。

评论

0赞 JL Peyret 8/4/2023
如前所述,在 ZSH 上看起来有点不同。但没关系,对我来说,我不是在解析结果,只是用我的 Mk I 眼球评估它们。