如果命令行工具不在 PATH 中,则安装它

如果命令行工具不在 PATH 中,则安装它

我有这个 bash 函数,如果它不在 PATH 中,我正尝试用它来安装命令行工具:

ncf(){

  if ! type -f ncf &> /dev/null || ! which ncf &> /dev/null; then

       echo "Installing NPM package '@oresoftware/ncf' globally...";

       npm i -s -g '@oresoftware/ncf' || {
         echo -e "Could not install NPM package '@oresoftware/ncf' globally." >&2
         echo -e "Please check your permissions to install global NPM packages." >&2
         return 1;
       }

  fi

  command ncf $@;
}

我有几个问题 -type -f ncf和是which ncf多余的吗?现在,我正在检查它们中的任何一个是否以非零退出 - 如果其中一个退出,我会重新安装(至少我认为代码是这样做的)。

我的另一个问题是 - 是否&>适用于 4 之前的 bash 版本,或其他 shell,如 sh、ksh、zsh 等?我是否应该使用另一种比 更跨平台的构造&>

答案1

which与 是多余的type,除非它完全做错了事情。不要使用which曾经(除了 ksh 或 zsh)。也不要type -f在便携式 sh 中使用:这是 ksh/bash 扩展。只需使用普通的type.如果您想要查找外部命令,尽管存在同名函数,您可以使用(unset -f ncf; type ncf).

要将输出重定向,请使用>/dev/null 2>&1.&>/dev/null在 ksh、bash 和 zsh 中可以缩写为,但在普通 sh 中则不能缩写。

  if ! type -f ncf >/dev/null 2>/dev/null; then …

相关内容