从 eval 返回值

Vie*_*urs 9 bash exit eval exit-status

bash 手册指出:

eval [arg ...]

          The  args  are read and concatenated together into a single com-
          mand.  This command is then read and executed by the shell,  and
          its  exit status is returned as the value of eval. If there are
          no args, or only null arguments, eval returns 0.
Run Code Online (Sandbox Code Playgroud)

我试试

eval `nonsense`
echo $?
Run Code Online (Sandbox Code Playgroud)

结果是0

而当我单独执行反引号命令时:

`nonsense`
echo $?
Run Code Online (Sandbox Code Playgroud)

结果是127

从什么是写在bash的手册我希望eval以回报127服用后引号时nonsense作为参数。

如何获取参数的退出状态eval

Sté*_*las 13

其实更多的是:

$ `nonsense`
bash: nonsense: command not found
$ echo "$?"
127
Run Code Online (Sandbox Code Playgroud)

这是令人惊讶的。

我们要求在 .stdoutbash上运行 split+glob 运算符结果的命令nonsense。由于不nonsense产生输出,它不运行任何命令,所以你可能认为退出状态应该是 0。

但实际上,当一个简单的命令行没有参数,只有赋值或重定向时,退出状态是赋值中的最后一个命令替换和运行的正常词(不在重定向目标中)的状态(尽管重定向失败也会影响退出状态)。

这对作业特别有用。

在:

output=$(grep pattern file)
status=$?
Run Code Online (Sandbox Code Playgroud)

您可以获得 的输出和退出状态grep,如果不是$?该非命令的退出状态,则您无法获得。

在:

output=$(cmd1) cmd2
Run Code Online (Sandbox Code Playgroud)

那就是同时存在赋值词和参数词的地方,cmd1忽略退出状态。$?将包含 的退出状态cmd2

而且,也$output只会被设置为cmd2only。例外情况是 whencmd2是一个特殊的内置函数。

eval是这样一个特殊的内置.

$ a=0; a=1 eval; echo "$a"
1
Run Code Online (Sandbox Code Playgroud)

bash大多数现代 POSIX shell 中。

a=`exit 5` eval; echo "$?"
Run Code Online (Sandbox Code Playgroud)

或者

eval `exit 5`; echo "$?"
Run Code Online (Sandbox Code Playgroud)

将输出 0,因为它是eval无参数运行的结果。但在 Bourne shell 或 ksh88 中情况并非如此,对于特殊的内置函数,您将获得那里的退出状态exit 5

在这些 shell 中,您还会发现:

$ a=`exit 3` set x; echo "$?"
3
Run Code Online (Sandbox Code Playgroud)

由于set是另一个特殊的内置。

.是另一个特殊的内置函数。在 Bourne shell 和 ksh88 中:

$ . /some/file `exit 4`; echo "$?"
4
Run Code Online (Sandbox Code Playgroud)

(只要/some/file不运行任何命令)

  • 我很困惑。OP 提供了上下文,这就是正在响应的内容,但是所提出的实际问题的答案在哪里:“如何获取 eval 参数的退出状态?” 我想我需要更仔细地阅读? (8认同)

ami*_*sax 8

当您执行以下操作时 -

`nonsense`
echo $?
Run Code Online (Sandbox Code Playgroud)

您基本上是在问“当我尝试获取无意义命令的输出时告诉我退出状态”,答案是“找不到命令”或 127

但是当您执行以下操作时

eval `nonsense`
echo $?
Run Code Online (Sandbox Code Playgroud)

你问“当我评估一个空字符串时告诉我 eval 的退出状态”(命令废话的输出),这等于eval不带参数运行。

eval 无参数运行没有问题,退出状态变为0

  • 代码格式不应用于英语散文。 (6认同)
  • 我糊涂了。OP 提供了上下文,这就是正在响应的内容,但是提出的实际问题的答案在哪里:“如何获得 eval 参数的退出状态?” 我想我需要更仔细地阅读? (4认同)