Лучший и короткий способ запуска программы, если другой не установлен

У меня есть этот код:

#!/bin/bash num=${1:-undefined} cmd=$(which {banner,echo} | head -n1) until [[ "$num" =~ ^[0-9]+$ ]]; do read -p "Type a number: " num done for ((num;num>=0;num--)); do $cmd $num sleep 1 done 

Но я думаю, что есть лучший способ узнать, установлена ​​ли программа. Я пробовал это. Однако я думаю, что это неясно:

  1. which banner && cmd=banner || cmd=echo
  2. cmd=$(eval 'which '{banner,echo}'||' :)
  3. cmd=$(which {banner,echo} | head -n1)
  4. cmd=$(which banner || which echo)

Мне нравится еще 3, чем остальные, но я думаю, что кто-то может помочь мне найти хороший метод для этого. Вместо этого я принимаю использование type , hash или command .

Это сложная задача кода, поэтому я хочу сделать oneliner, сделать ее коротким и попытаться не повторять имя переменной или любую команду (кроме || , && и так далее)

2 Solutions collect form web for “Лучший и короткий способ запуска программы, если другой не установлен”

Функциональный подход приводит к самому четкому коду. Возможны как минимум два варианта, предложенный FloHimself выше в комментарии (который не был бы моим предпочтительным способом):

 function myprint { if type banner >/dev/null then banner "$@" else echo "$@" fi } myprint "Hello World!" 

или – вариант, который я предпочел бы – использовать определение условной функции :

 if type banner >/dev/null then function myprint { banner "$@" ;} else function myprint { echo "$@" ;} fi myprint "Hello World!" 

который не имеет накладных расходов при if -condition с каждым вызовом и который также не требует дублирования строковых или переменных выражений (как в другом предложении).

Самый простой способ – просто запустить

 command1 "hello world" || command2 "hello world" 

Если первая команда не существует, левая часть || wil сбой, так что команда справа будет запущена. Я не понимаю, зачем вам сначала тестировать. Просто сделайте, и если вы потерпите неудачу, сделайте что-нибудь еще.

Вы можете сделать это немного лучше, проигнорировав сообщения об ошибках по отсутствующей команде и избегая повторения строки:

 string="Hello world!" banner "$string" || echo "$string" 

Если вам действительно нужно проверить наличие команды, я бы сделал это следующим образом:

 command="banner" type "$command" 2>/dev/null || command="echo" "$command" "Hello world!" 
  • Сценарий Bash для удаления каталогов старше 5 дней?
  • Записывать записи для каждой директории в дереве
  • Как работает sudo (помимо setuid)?
  • распечатать все значения файла после удаления некоторых символов с помощью grep
  • Выполнение команды на разных оболочках
  • Строки префикса и суффикса для каждой выходной строки из команды
  • Сценарий оболочки для назначения значений из таблицы поиска слишком медленный
  • Условный оператор Баша и присвоение
  • сопоставление sed шаблонов с удалением по строке
  • Открыть окно терминала из сценария
  • Выполнение команд с помощью сценария ssh и оболочки с использованием переменных на удаленной машине
  • Linux и Unix - лучшая ОС в мире.