在此脚本的早期,用户及其凭据被读入变量中。
以下代码按预期工作,用于检查 mysql 用户的凭据。
lu="test"
lp="test-password"
ldb="local_db"
if mysql -u $lu -p"$lp" $ldb -e "quit"; then
printf "true"
return 0;
else
printf "false"
return 1;
fi
当此代码执行时,它会输出有关在命令行上使用密码的 mysql 警告。我想抑制输出中的警告,同时仍然评估 mysql 命令的退出代码。
在这个回答关于如何使用 抑制错误消息mysqlcommand 2>&1 | grep -v "Warning: Using a password"
,输出仅删除警告。所有其他输出仍然显示。
我尝试将其集成到我的代码中,但没有成功。我有办法做到这一点吗?
答案1
是的。您遇到的问题是管道的退出状态是管道中最后一个元素的退出状态。
对于最新版本的 bash,您可以使用 PIPESTATUS 数组,并编写
mysqlcommand 2>&1 | grep -v ...
if [ ${PIPESTATUS[0]} -eq 0 ] ; then
printf "true\n"
return 0
else
...
存在更便携的解决方案。你可以运行
( mysqlcommand ; echo $? > lastsqlret ;) 2>&1 | grep ...
if grep '^0$' lastsqlret ; then
...
使用临时文件,您可以通过使用文件描述符操作来避免临时文件。
答案2
管道的退出状态始终是最后一个命令的退出状态。在 bash 中,您可以通过设置来更改此行为set -o pipefail
。使用此选项,整个命令将具有最后遇到的非零退出状态的退出状态,来自手册页:
除非启用了 pipelinefail 选项,否则管道的返回状态是最后一个命令的退出状态。如果启用了 pipelinefail,则管道的返回状态是最后一个(最右边)以非零状态退出的命令的值,如果所有命令成功退出,则返回零。
例子:
#!/bin/bash
false | true
echo "Without pipefail: $?"
set -o pipefail
false | true
echo "With pipefail: $?"
生产:
Without pipefail: 0
With pipefail: 1