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

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

#!/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, сделать ее коротким и попытаться не повторять имя переменной или любую команду (кроме || , && и так далее)

  • Couting всех символов с помощью класса символов BASH
  • Как вернуть код выхода? Ошибка: return: Чтение: требуется числовой аргумент
  • Как очистить или перезаписать ОЗУ и выключить компьютер по сценарию bash, который реагирует на сочетание клавиш?
  • Сценарий оболочки только для подсчета последовательных дней
  • Итерация над массивом bash
  • Как я могу группировать числа в файле
  • Как выполнить удаленный сценарий с помощью «экранов»?
  • Замените все вхождения строки, найденной в файле, используя значения из другого файла
  • 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!" 
    Interesting Posts

    Устранение неполадок при использовании Gtk-приложения (Gvim)

    Debian + KVM: какую версию использовать? Стабильный или «новый»?

    X11 / Xlib.h: нет такого файла или каталога

    не удается найти интерпретатор при запуске исполняемого файла Windows

    OS X El Capitan, systemstats: com.apple.telemetry.shutdown

    VNC & SSH: локальный (win-putty) -> hop (linux) -> remote (linux)

    Настройка Bind9 – lsb-base не в источниках

    Нет такого файла или каталога, но я могу это увидеть!

    В emacs существует ли способ Hex редактировать / просматривать буфер без потери информации об отмене?

    Bluetooth: невозможно подключиться к Интернету на ноутбуке от Nokia N73

    Можно ли установить все доступные пакеты TexLive в Fedora?

    Как «объединить» два текстовых файла?

    Запись в интерактивную подсказку

    Как проверить, существуют ли в файле некоторые строки, существующие в файле?

    При возобновлении сна спящий ноутбук занимает 6-8 секунд. Что может быть причиной?

    Linux и Unix - лучшая ОС в мире.