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

Running programs only if they are installed, and ignoring them otherwise

编写 shell 脚本时,是 运行 程序的成语或 swift 方式 如果已安装,并且如果不是,就随它去吧(或者以除安装之外的其他方式处理错误)?

更具体地说,我有很多通过 ssh 访问的服务器,每当我得到一个新服务器时,我只需将所有 rc 文件复制到它。 .zshrc 启动 tmux 除非它已经 运行ning。一些服务器(不是全部)没有安装 tmux。由于磁盘 space 的限制,我不想安装它,我不想为不同的服务器使用不同的 rc 文件,我也不希望我的 rc 文件在执行时被中断。

我已经看到涉及 apt-cache policy <package-name> 的解决方案,所以我想我可以使用它并将其通过管道传输到 grep -e 'Installed: (none)' 之类的东西,但那会假设服务器是 运行ning Debian或 Ubuntu,我做不到,它只适用于使用 apt 安装的包,不适用于我以其他方式安装的包。

这可能会有所帮助-

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

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

...

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

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

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

例如:

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

(>/dev/null 因为,如果命令存在,它的路径将打印到 STDOUT。)

将其放入可重用函数中可能会很好:

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

然后可以使用:

maybe tmux a -t name

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

或者,如果您在命令不可用时需要一些反馈:

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