Bash / 退出状态为 0,而预期为 255

Bash / 退出状态为 0,而预期为 255

有我用于测试的代码

hola="cd /var && ssh localhost.error" $hola echo $?

执行

cd /var && ssh localhost.error

将返回代码 255。

但执行

hola="cd /var && ssh localhost.error" $hola

返回 0,而预期为 255。

hola="ssh localhost.error" $hola

返回 255。

为什么?

答案1

hola="cd /var && ssh localhost.error"
$hola

执行此操作时,第二行将导致您使用cd参数/var&&ssh和调用命令localhost.error。 Cd 忽略除第一个参数之外的所有内容,并成功更改为 /var,因此它不会打印错误。

这是因为 bash 处理命令行的顺序。当你输入 时cd /var && ssh localhost.error,在 bash 术语中,这是指列表两个命令s. Bash 将列表解析为单独的命令,然后解析每个命令。变量扩展发生在命令解析期间,而不是列表解析期间。

当您运行时$hola,列表解析器将其解析为单个命令。命令解析器运行,扩展变量,并看到&&,但它对于命令解析器来说并不特殊。

您可以尝试使用 shell 函数:

function hola { cd /var && ssh localhost.error; }

答案2

这可能与您没有在同一行运行命令,而是使用该命令保存字符串,然后调用保存该字符串的变量有关。

尝试一下这个:

hola=$(cd /var && ssh localhost.error)
echo $hola

这应该返回255,或者任何您所期望的错误代码。

看这个例子:

> hola="echo hi"
> $hola
hi
>echo $?
0

> hola="hi"
> $hola
ksh: hi:  not found
> echo $?
127

相关内容