由于环境名称不存在,printenv 退出并显示错误代码 1

由于环境名称不存在,printenv 退出并显示错误代码 1

我使用的是 LinuxMint(也尝试过 CentOS),并且一直在尝试使用 printenv 命令来设置可能存在或不存在的环境变量。所以我希望它打印该名称的值(如果存在),否则不打印任何内容,但返回退出代码 0。

但是,如果我使用不存在的环境名称调用它,它将退出并显示错误代码 1。 printenv 的手册页或帮助没有说明此行为。

这是我尝试的方法:

> /usr/bin/printenv foo

那只是返回,然后我这样做:

> echo $?

返回:

1

printenv 的版本是:

printenv (GNU coreutils) 8.25
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by David MacKenzie and Richard Mlynarik.

有没有人有其他方法来实现我所追求的目标?最终,我只需要设置一个 bash 变量来包含环境变量的值(如果该环境变量存在),否则将该 bash 变量清空:

mybashv=`printenv foo`

答案1

printenv 的信息文档说明了有关退出代码的以下内容:

 0 if all variables specified were found
 1 if at least one specified variable was not found
 2 if a write error occurred

这看起来与您观察到的一致。

如果我理解正确的话,你想隐藏这个状态代码。对于任何命令,这可以通过附加 来实现|| true,例如:

$ var=`printenv foo || true`
$ echo $?
0

答案2

当无法打印环境变量的内容时返回非零退出状态(失败)听起来对我来说是正确的事情。这tcsh与同名内置函数和 BSD 上的历史实现的行为相匹配。

如果不这样做,将很难区分设置为空值的变量和未设置的变量。

set -e如果您想避免/的影响set -o errexit,请使用:

var=$(printenv VAR) || : Do not care if it fails

或者:

if var=$(printenv VAR); then
  if [ -z "$var" ]; then
    echo "VAR is set but empty or consists only of newline characters"
  else
    echo "VAR is set and non-empty"
  fi
else
  echo "VAR is not in the environment"
fi

另请注意,所有 shell 都会从相应的环境变量中初始化 shell 变量(对于那些可以映射到 shell 变量的变量,有些 shell 会删除不能映射到的变量),因此您也可以$VAR在脚本中使用它们来引用它们的值(但请注意,在 Bourne、csh 或 tcsh shell(人们可能仍想使用`...`您的 shell 的唯一 shell)中,如果您修改 shell 变量而不导出它(或分配它与setenvfor (t)csh)) 一起使用。

相关内容