【发布时间】:2015-10-08 04:43:59
【问题描述】:
我想在 bash 脚本中执行一系列命令。
如果有任何失败,脚本应该echo一行描述失败的行,然后退出函数。
目前,我的脚本充分地回显了输出,但没有退出脚本(因为echo 命令返回0)。
我有
COMMAND_A || echo "command A failed" | tee -a $SUMMARY_FILE
COMMAND_B || echo "command B failed" | tee -a $SUMMARY_FILE
COMMAND_C || echo "command C failed" | tee -a $SUMMARY_FILE
但这些与前一行无关 - 我认为用bash -e 括起来也无济于事,因为那时COMMAND_A 失败将在没有echo 的情况下退出,否则echo 将成功并且什么都没有会退出。
由于echo 会成功,我不能只在每一行添加&&。
我也许可以使用
{ COMMAND_A && \
{ COMMAND_B && \
{ COMMAND_C || echo "C failed" | tee -a $SUM } \
|| echo "B failed" | tee -a $SUM } \
|| echo "A failed" | tee -a $SUM }
但这看起来很笨重。
有更好的语法/风格/方法吗?
举个具体的例子:
cmake -DCMAKE_INSTALL_PREFIX=$PREFIX -DCMAKE_BUILD_TYPE=Release .. || \
echo "$(date +%d/%m/%y-%H:%M:%S): cmake failed for $1" | tee -a $SUMFILE
make -j16 || \
echo "$(date +%d/%m/%y-%H:%M:%S): make failed for $1" | tee -a $SUMFILE
sudo make install && \
echo "$(date +%d/%m/%y-%H:%M:%S): Installed $1" | tee -a $SUMFILE || \
echo "$(date +%d/%m/%y-%H:%M:%S): make install failed for $1" | tee -a $SUMFILE
编辑
也许我可以通过
得到一些改进COMMAND_A || { echo "A failed" && false; } && \
COMMAND_B || { echo "B failed" && false; } && \
COMMAND_C && echo "C succeeded" || { echo "C failed" && false; }
但是如果A 失败,这仍然会显示A、B 和C 失败(即使命令被短路,因此得到了改进)
【问题讨论】:
标签: linux bash logical-operators