Установка инструмента командной строки, если его нет в 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 избыточный which ncf ? Прямо сейчас я проверяю, выходит ли какой-либо из них с ненулевым значением – если я либо один из них, я переустанавливаю (по крайней мере, это то, что я думаю, код делает).

Другой мой вопрос – будет ли &> работать для версий bash старше 4 или других оболочек, таких как sh, ksh, zsh и т. Д.? Есть ли другая конструкция, которую я должен использовать, которая более кроссплатформенная, чем &> ?

    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 …