仅在安装程序后运行它们,否则忽略它们

时间:2018-09-04 08:36:34

标签: shell posix idioms

编写shell脚本时,是仅运行程序的一种惯用法或快速方式 (如果已安装),如果未安装,则任其运行(或处理其他错误)除了安装之外)?

更具体地说,我有很多服务器可以通过ssh访问,每当获得新服务器时,我都将所有rc文件复制到该服务器中。除非它已经运行,否则.zshrc将启动tmux。某些服务器(并非全部)未安装tmux。由于磁盘空间的限制,我不想安装它,我不想为不同的服务器使用不同的rc文件,并且我不希望我的rc文件在执行时被打断。

我已经看到了涉及apt-cache policy <package-name>的解决方案,所以我想我可以使用它并将其通过管道传输到类似grep -e 'Installed: (none)'的地方,但这可以假定服务器正在运行Debian或Ubuntu,但我不能这样做,并且仅适用于与apt一起安装的软件包,不适用于我以其他方式安装的软件包。

2 个答案:

答案 0 :(得分:1)

command -v <command>是检查命令是否可以执行(在$PATH上是可执行的)的常用(和POSIX)方法。

例如:

command -v tmux >/dev/null &&
  tmux a -t name

({>/dev/null,因为如果存在该命令,则其路径将被打印到STDOUT。)

最好将其放在可重用的函数中:

maybe() {
  ! command -v "${1}" >/dev/null ||
    "$@"
}

然后可以使用:

maybe tmux a -t name

如果tmux可用,则tmux a -t name将运行,否则它将被忽略。

或者,如果您希望在命令不可用时得到一些反馈:

maybe() {
  if command -v "${1}" >/dev/null
  then
    "$@"
  else
    printf 'Command "%s" not available, skipping\n' "${1}" >&2
  fi
}

答案 1 :(得分:0)

这可能有帮助-

1)假设tmux在PATH中可用(因为它必须是可执行文件)

isAvailable=$(type -P tmux)
if [[ -x $isAvailable ]]; then 

...

2)验证文件是否位于特定路径上(复制所有rc文件)

export FILEPATH="..."
if[[ -f $FILEPATH ]]; then