Запуск программ, только если они установлены, и игнорирование их в противном случае - PullRequest
0 голосов
/ 04 сентября 2018

При написании сценариев оболочки это идиома или быстрый способ запуска программы только , если она установлена, а если нет, просто оставьте ее (или обработайте ошибку другим способом кроме установки)?

В частности, у меня есть много серверов, к которым я обращаюсь через ssh, и всякий раз, когда я получаю новый сервер, я просто копирую на него все свои rc-файлы. .Zshrc запускается tmux, если он уже не запущен. На некоторых серверах (не на всех) не установлена ​​tmux. Я не хочу устанавливать его из-за ограничений дискового пространства, я не хочу иметь разные rc-файлы для разных серверов и не хочу, чтобы мои rc-файлы прерывались при их выполнении.

Я видел решения, включающие apt-cache policy <package-name>, так что, думаю, я мог бы использовать это и перенаправить на что-то вроде grep -e 'Installed: (none)', но это предполагает, что на сервере работает Debian или Ubuntu, чего я не могу сделать, и это будет работать только для пакетов, которые были установлены с apt, а не с теми, которые я установил другими способами.

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

command -v <command> - это общий (и POSIX) способ проверить, может ли команда быть выполнена (является ли она исполняемой и для $PATH).

например:

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
}
0 голосов
/ 04 сентября 2018

Это может помочь-

1) Предполагается, что tmux доступен в PATH (так как он должен быть исполняемым)

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

...

2) Проверить наличие файла по указанному пути (Копирование всех rc-файлов)

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