有我用于测试的代码
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