在 || 之后放置两个命令

在 || 之后放置两个命令

我想检查一下以确保有一些命令可用。如果不是,我想打印一条错误消息然后退出。

我想在不检查变量的情况下执行此操作,因为它是脚本中的一个小点,我不希望它遍布一堆行。

我想使用的形状基本上是这样的:

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

如果没有rsyncon $PATH,将报告

$0: rsync: 未找到命令

(用您的脚本名称代替$0)并以状态 127 退出。

相关内容