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

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

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

  • Объединение нескольких файлов с одинаковым заголовком
  • Bash для преобразования всех * flac в * .mp3 с FFmpeg?
  • Как сделать svn искать, если есть обновление раз в минуту, и если есть вызов какого-то скрипта?
  • Скрипт выполняется иначе, если выполняется из udev
  • Не удалось запустить файл локального скрипта с переменными через ssh
  • Скрипт с использованием sudo работает с терминала, но не с ярлыка на рабочем столе
  • сценарий оболочки для автоматического уничтожения процессов, соответствующих определенным критериям
  • как использовать команду eval для печати значения параметра
  • 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

    Цифры с нулевым заполнением до 2 цифр с помощью sed

    Ошибка при настройке dynupdater5.4.0-2

    rlwrap: autocompletion mysql не работает

    Ошибка при добавлении пользователя

    Как подключиться к моему серверу через его доменное имя после перенаправления его на внутренний IP через / etc / hosts?

    Что такое «<Esc> Kv» в bash

    Есть ли способ отключить панель инструментов с плазмоидами, которая появляется, когда мышь находится над виджетами / плазмоидами?

    Разрешение гостевой ОС (слишком маленький текст) в рабочей станции vmware 12

    Ошибка «grep: memory outed» на большом разделе

    Какие типы типов файлов делают цвета в терминале в разных дистрибутивах (по умолчанию)?

    Использование вторичного DNS при сбое поиска в первичном?

    неустойчивое apt-пиннинг, установленное на -1 на стабильном Debian

    Вызывает ли процесс, вызывающий убийцу-убийцу?

    Вывод сценария оболочки неправильно разбивается при передаче в качестве аргумента скрипту

    Возврат последнего записанного файла, содержащий определенную подстроку в имени файла?

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