我想检查一下以确保有一些命令可用。如果不是,我想打印一条错误消息然后退出。
我想在不检查变量的情况下执行此操作,因为它是脚本中的一个小点,我不希望它遍布一堆行。
我想使用的形状基本上是这样的:
rsync --help >> /dev/null 2>&1 || printf "%s\n" "rsync not found, exiting."; exit 1
不幸的是,exit 1
无论 rsync 结果如何,都会执行。
有没有办法在 bash 中使用这个 perl 类型的 die 消息,或者没有?
答案1
要直接回答问题,请将命令组合在一起,因此:
rsync --help >> /dev/null 2>&1 || { printf "%s\n" "rsync not found, exiting."; exit 1; }
作为做你想做的事情的建议,但以另一种方式:
#!/usr/bin/env bash
for c in rsync ls doesnotexist othercommand grep
do
if ! type "$c" &> /dev/null
then
printf "$c not found, exiting\n"
exit 1
fi
done
die
如果你想在 shell 中模拟 perl :
function die {
printf "%s\n" "$@" >&2
exit 1
}
# ...
if ! type "$c" &> /dev/null
then
die "$c not found, exiting"
fi
# ...
答案2
必须是单行吗?我不太喜欢短路。我会这样写:
if ! rsync --help &>/dev/null; then
printf "%s\n" "rsync not found, exiting."
exit 1
fi
答案3
最简单的方法(因为您可能想在多个地方做同样的事情)是定义一个函数:
die()
{
echo "$@" >2
logger -t "$0" -- "$*"
exit 1;
}
请注意,die
将其错误消息发送到标准错误 - 在一般情况下您会需要这样做。我还向 syslog 发送一条消息(我从中获取此消息的脚本是长期运行的),但如果您不想,则无需这样做。
然后你可以简单地使用它:
rsync -q --help 2>&- || die "rsync not found, exiting."
我还用来rsync -q
抑制成功案例中的帮助输出。事实上,您可能会发现您对以下行为感到满意
set -e
rsync -q --help
如果没有rsync
on $PATH
,将报告
$0
: rsync: 未找到命令
(用您的脚本名称代替$0
)并以状态 127 退出。