У меня в настоящее время есть команда:
command -v gpg 2>/dev/null || { echo "Cound not find gpg. Aborting."; }
Я хотел бы за вместо него перенаправляющий вывод к/dev/null, я хотел бы отобразить сообщение, заявляя вывод команды и послесловий found!
.
Т.е.
Cound not find gpg. Aborting.
gpg found at /usr/local/bin/gpg
Самый простой подход был бы чем-то вроде этого:
command -v gpg &>/dev/null &&
echo "gpg found at $(command -v gpg)" ||
echo "Cound not find gpg. Aborting."
Конечно, это не очень изящно, так как это должно работать command
дважды. Альтернатива была бы:
gpg=$(command -v gpg 2>/dev/null) &&
echo "gpg found at $gpg." ||
echo "Cound not find gpg. Aborting."
Это добилось бы цели:
command -v gpg &>/dev/null && echo "gpg has been found at $(which gpg)" ||
{ echo "Cound not find gpg. Aborting."; }
Хотя принятое решение terdon ♦ кратко и симпатично, я предложил бы что-то как:
cmd_exists() {
(
unalias "$1" 2>/dev/null
status=$(command -v "$1")
case $status in
*"$1") echo "$1 found at $status";;
"") echo "Could not find $1. Aborting."; return 127;;
*) echo "Error: $status" >&2; return 1;;
esac
)
}
cmd_exists gpg
Это имеет дело с двумя случаями не, имел дело другим методом здесь:
Псевдонимы: они могут скрыть исполняемый файл, но моя функция дает Вам фактический путь к исполняемому файлу, только если существует тот. Другие методы дадут Вам определение псевдонима и возвратят нулевой код выхода, существует ли фактическая команда позади него или нет.
Лучшая обработка ошибок: Код выхода 127 обозначает "Команду, не найденную" тип ошибок, таким образом, у Вас может быть отдельная обработка ошибок для того, когда команда не найдена и когда некоторая другая ошибка происходит.
Если существует некоторая неуловимая ошибка (то есть, неизвестная ошибка кроме команды, не находимой), она не скрывает его, заставляя Вас поверить gpg
не существует, когда это может. Если Вы хотите отбросить это ошибки, то назовите его как:
cmd_exists gpg 2>/dev/null
Примечания:
Относительно псевдонимов это может или не может быть тем, что Вы хотите, например, знание, что псевдоним существует, может быть достаточно для Вас.
Непсевдоним происходит в подоболочке, таким образом, он не смешает псевдонимы Вашей рабочей оболочки.
Относительно обработки ошибок я не эксперт по сценариям оболочки, таким образом, я не знал бы, как, вероятно, ошибка будет в этой ситуации, ни если существует лучший способ обработать их.
Поэтому остерегайтесь, это могло бы быть излишеством.