Bash,如果失败,远程服务器上的命令将返回true

Bash,如果失败,远程服务器上的命令将返回true,bash,if-statement,ssh,command,Bash,If Statement,Ssh,Command,即使失败,在远程服务器上执行的命令也返回true。这是代码 command=" sudo su - postgres -c 'pg_dump -Fc ${var[1]}' " if ssh -n -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no "$username"@"${var[0]}" "$command" > "$folder_export"/"${var[0]}"/"$date"-"$time"-"${var

即使失败,在远程服务器上执行的命令也返回true。这是代码

command="
sudo su - postgres -c 'pg_dump -Fc ${var[1]}'
"

if
ssh -n -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no "$username"@"${var[0]}" "$command" > "$folder_export"/"${var[0]}"/"$date"-"$time"-"${var[0]}"-"${var[1]}".dump
export_end=$date-$time
then
export=true
else
export=false
fi
我试图在远程服务器上停止postgres。 输出显示了这一点

pg_dump: [archiver (db)] connection to database "coopweb" failed: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
但如果条件返回true。我不知道为什么。 ssh命令中的某些选项可能有误吗?或者问题出在哪里


谢谢。

在您的语句中,if表达式中计算的返回码是变量export\u end赋值的返回码。 一种解决方案是将此分配移动到if/else分支:

 ...
 if ssh -n -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no "$username"@"${var[0]}" "$command" > "$folder_export"/"${var[0]}"/"$date"-"$time"-"${var[0]}"-"${var[1]}".dump
 then
   export_end=$date-$time
   export=true
 else
   export_end=$date-$time
   export=false
 fi

在语句中,if表达式中计算的返回码是变量export_end赋值的返回码。 一种解决方案是将此分配移动到if/else分支:

 ...
 if ssh -n -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no "$username"@"${var[0]}" "$command" > "$folder_export"/"${var[0]}"/"$date"-"$time"-"${var[0]}"-"${var[1]}".dump
 then
   export_end=$date-$time
   export=true
 else
   export_end=$date-$time
   export=false
 fi

与其复制赋值,不如将其移到条件外。否则,你会发现,它是有效的!两种解决方案都有。谢谢所以问题是,返回代码是从最后一个命令/变量赋值生成的?是的,正如您所做的,您可以将命令列表放在“if”之后。后续命令的退出代码覆盖上一个命令的退出代码,以便使用最后一个命令的退出代码来计算if语句。在您的例子中,它是一个始终返回0的变量赋值。关于此代码的另一个问题是,export\u start和export\u end返回相同的值,但进程的开始和结束时间不同。这是我在变量date和time中的内容:date=$(date+%Y%m%d)time=$(date+%H%m%S)。$date和$time从设置变量时的时间点获取值。那以后天气不会变。你可以用关于问题的完整代码打开一个新问题。与其重复作业,不如将其移到条件外。否则,你会发现,它是有效的!两种解决方案都有。谢谢所以问题是,返回代码是从最后一个命令/变量赋值生成的?是的,正如您所做的,您可以将命令列表放在“if”之后。后续命令的退出代码覆盖上一个命令的退出代码,以便使用最后一个命令的退出代码来计算if语句。在您的例子中,它是一个始终返回0的变量赋值。关于此代码的另一个问题是,export\u start和export\u end返回相同的值,但进程的开始和结束时间不同。这是我在变量date和time中的内容:date=$(date+%Y%m%d)time=$(date+%H%m%S)。$date和$time从设置变量时的时间点获取值。那以后天气不会变。您可以使用有关该问题的完整代码打开一个新问题。该脚本有问题,无法执行。Shellcheck为您的代码生成7个结果。请修改脚本。另请参见和。脚本有问题,无法执行。Shellcheck为您的代码生成7个结果。请修改脚本。另请参见和。