我想在 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
, B
和 C
如果 A
失败失败(即使命令被短路,因此改进)
最佳答案
由于一系列命令是在函数内执行的,因此可以使用return
语句。
如果不是这种情况,exit
可能是合适的选择。
因此,我可以在问题的编辑中使用这个想法来写:
standardInstall() {
# Should be passed the directory (ie application/library) name as
# an argument.
if [ -z "$1" ]; then
echo "No argument was passed to standardInstall()"
echo "Exiting"
exit 2
fi
pushd $1/build/
cmake -DCMAKE_INSTALL_PREFIX=$KF5 -DCMAKE_BUILD_TYPE=Release .. || \
{ echo "$(date +%d/%m/%y-%H:%M:%S): cmake failed for $1" \
| tee -a $SUMFILE && return 1; } && \
make -j16 || \
{ echo "$(date +%d/%m/%y-%H:%M:%S): make failed for $1" \
| tee -a $SUMFILE && return 1; } && \
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 && return 1; }
popd
}
关于linux - 链式 && 和 || bash 脚本中的运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33006797/