Я программирование Linux сценария оболочки , который будет печатать баннеры состояния во время его выполнения , только если правильный инструмент, скажем figlet
, будет установлен (это: достижимы системами пути ).
Пример:
#!/usr/bin/env bash
echo "foo"
figlet "Starting"
echo "moo"
figlet "Working"
echo "foo moo"
figlet "Finished"
Я бы хотел, чтобы мой скрипт работал без ошибок, даже если figlet
он не установлен .
Какой может быть практический метод ?
shell
scripting
executable
Сопалахо де Арриерес
источник
источник
figlet ... || true
.figlet || true
, но в вашем случае, вероятно, используется функция оболочки, которая выдает открытый текст, если не может быть напечатан баннер, с большей вероятностью то, что вам нужно.Ответы:
Моя интерпретация будет использовать функцию-оболочку, названную так же, как инструмент; в этой функции запустите реальный инструмент, если он существует:
Тогда вы можете
figlet arg1 arg2...
без изменений в вашем сценарии.@Olorin предложил более простой метод: определять функцию-обертку, только если нам нужно (если инструмент не существует):
Если вы хотите, чтобы аргументы
figlet
были напечатаны, даже если figlet не установлен, измените предложение Олорина следующим образом:источник
command
берутся? У меня его нет в моих установках (Red Hat 6.8 Enterprise и Cygwin64).command
встроенная оболочка POSIX Bourne Обычно она выполняет предоставленную команду, но-v
флаг делает ее более похожей наtype
другую встроенную оболочку.type -a command
покажет вам.which
будет отображать только исполняемые файлы на ваших$PATH
, а не встроенные, ключевые слова, функции или псевдонимы.which
действительно находит подходящий псевдоним, потому что он создает псевдонимыwhich
для запуска/usr/bin/which
и передачи ему списка псевдонимов оболочки для просмотра (!) (конечно,\which
подавляет псевдоним и использует только программу, которая не показывает псевдонимы.)Вы можете проверить, если
figlet
существуетисточник
Обычный способ сделать это с
test -x
ака[ -x
. Вот пример, взятый из/etc/init.d/ntp
системы Linux:Этот вариант основан на знании полного пути исполняемого файла. В
/bin/lesspipe
я нашел пример, который работает вокруг этого путем объединения-x
иwhich
команды:Таким образом, это будет работать, не зная заранее, где
PATH
находитсяbunzip
исполняемый файл.источник
which
. И даже еслиwhich
сработало, использованиеtest -x
на его выходе глупо: если вы получаете путьwhich
, он существует.test -x
это больше, чем просто проверка, существует ли файл (вот для чегоtest -e
). Он также проверяет, есть ли у файла установленные разрешения на выполнение.which
.В начале вашего скрипта проверьте,
figlet
существует ли , а если нет, определите функцию оболочки, которая ничего не делает:type
проверяет,figlet
существует ли встроенная оболочка, функция, псевдоним или ключевое слово,>/dev/null 2>&1
отбрасывает stdin и stdout, чтобы вы не получили никакого вывода, и, если он не существует,figlet() { :; }
определяетfiglet
как функцию, которая ничего не делает.Таким образом, вам не нужно редактировать каждую строку вашего скрипта, которая используется
figlet
, или проверять, существует ли она каждый раз, когдаfiglet
вызывается.Вы можете добавить диагностическое сообщение, если вам нравится:
В качестве бонуса, поскольку вы не упомянули, какую оболочку вы используете, я считаю, что она совместима с POSIX, поэтому она должна работать практически на любой оболочке.
источник
type figlet >/dev/null 2>&1
на,hash figlet 2>/dev/null
если вы используете Bash. (ОП сказала «если это в моем ПУТИ».)Другая альтернатива - шаблон, который я видел в сценариях автоматической настройки проекта:
В вашем конкретном случае вы могли бы даже сделать,
Если вы не знаете конкретный путь, вы можете попробовать несколько
elif
(см. Выше), чтобы попробовать известные места, или просто использоватьPATH
чтобы всегда разрешать команду:В общем, при написании скриптов я предпочитаю вызывать команды только в определенных мной местах. Мне не нравится неопределенность / риск того, что конечный пользователь мог бы положить в их
PATH
, возможно, в свои собственные~/bin
.Если, например, я пишу сложный сценарий для других, который может удалять файлы на основе вывода конкретной команды, которую я вызываю, я бы не хотел случайно брать в них
~/bin
что- то, что может или не может быть командой Я ожидал.источник
figlet
был в/usr/local/bin
или/home/bob/stuff/programs/executable/figlet
?Команда bash
type
находит команду, функцию, псевдоним, ключевое слово или встроенную функцию (см.help type
) И распечатывает местоположение или определение. Он также возвращает код возврата, представляющий результат поиска; true (0), если найдено. Итак, что мы делаем здесь, это пытаемся найтиfiglet
по пути (-p
означает искать только файлы, а не встроенные модули или функции, а также подавлять сообщения об ошибках), отбрасывать вывод (это то, что> /dev/null
делает), и если он возвращает true (&&
) , он выполнитfiglet
.Это проще, если
figlet
находится в фиксированном месте:Здесь мы используем
test
команду (aka[
), чтобы увидеть,/usr/bin/figlet
является ли исполняемый (-x
) и если да (&&
). Я думаю, что это решение более портативное, чем использование,type
и это, как мне кажется, башмизм.Вы можете сделать функцию, которая сделает это за вас:
(Кавычки необходимы из-за потенциальных пробелов)
Тогда вы просто сделаете:
источник
о /, я бы сказал что-то вроде
источник
Вы можете выполнить тестирование, подавив любой вывод и протестировать код успеха / сбоя. Выберите аргументы для figlet, чтобы сделать этот тест недорогим. -? или --help или --version - очевидные возможности.
Добавлено в ответ на комментарий ниже: если вы действительно хотите проверить, существует ли фиглет, а не то, что он пригоден для использования, то вы бы сделали
источник
$?
равно ли оно 127 (в моей системе Linux). 127 «команда не найдена». Но я думаю, что для рациональных команд, еслиcommand --help
не получится, то установки достаточно, чтобы ее не было!--help
доступности. У утилиты Posix, к примеру, его нет, и руководящие принципы posix действительно рекомендуют его .at --help
сбойat: invalid option -- '-'
, например, и состояние выхода в130
моей системе.-?
--help
--version
... или вы можете узнать, с чем выходитьfiglet -0 --illegal
, и воспринимать это как показатель успеха (если это не 127, что я бы оценил как саботаж).