команда -v пользовательский вывод

В настоящее время у меня есть команда:

command -v gpg 2>/dev/null || { echo "Cound not find gpg. Aborting."; }

Я бы хотел вместо нее перенаправить вывод в / dev / null, я бы хотел отобразить сообщение с указанием вывода команды и послесловия found!.

Т.е.

Если gpg не найден: Cound not find gpg. Aborting. Если найдено gpg: gpg found at /usr/local/bin/gpg
2
задан 21 July 2017 в 10:57

7 ответов

Самый простой подход будет примерно таким:

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."
5
ответ дан 22 May 2018 в 20:20
  • 1
    @Aaron duh! Конечно, спасибо. – terdon♦ 21 July 2017 в 17:00
  • 2
    AFAIK, если команда -v gpg не находит gpg, она ничего не выведет, так зачем отказываться от ошибки? – Samuel Santana 21 July 2017 в 18:13
  • 3
    @SamuelSantana, почему бы и нет? Возможно, будущая реализация command будет печатать что-то в stderr. Вам нечего терять с перенаправлением, и это может сделать его более надежным. Кроме того, рассмотрите случай, когда вы попробуете это на оболочке, которая не имеет command. Я не могу придумать, где синтаксис действителен, но может быть и там. Просто случай лучше, чем жаль. Кроме того, это было так, как первоначально было ОП. :) – terdon♦ 21 July 2017 в 18:28
  • 4
    Правда, будущая реализация могла бы это сделать, но в отношении вашей второй точки в случае, если command не существует или просто терпит неудачу, отбрасывание ошибки может дезинформировать вас: gpg существует, но command не удалось, поскольку -v не поддерживается (до того, как POSIX: 2008 поддержка опции -v команды не требовалась, поэтому могут существовать системы / оболочки, которые выдают ошибку на command -v); это заставит вас думать, что gpg не существует. Кроме того, в первом примере вам также нужно будет перенаправлять по-другому: >/dev/null 2>&1, хотя, реалистично, можно использовать инструкцию второго примера, а не первую. – Samuel Santana 21 July 2017 в 20:17
  • 5
    @SamuelSantana, почему мне нужно перенаправлять по-другому? Первый пример - это не переносная, специфичная для bash реализация оригинала OP. В bash &>/dev/null совпадает с >/dev/null 2>&1. – terdon♦ 21 July 2017 в 20:19

Это сделало бы трюк:

command -v gpg &>/dev/null && echo "gpg has been found at $(which gpg)" || { echo "Cound not find gpg. Aborting."; }
5
ответ дан 24 July 2018 в 19:28

Это сделало бы трюк:

command -v gpg &>/dev/null && echo "gpg has been found at $(which gpg)" || 
{ echo "Cound not find gpg. Aborting."; }
2
ответ дан 22 May 2018 в 20:20

Хотя принятое решение 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

Он имеет дело с двумя случаями, которые не рассматриваются другим методом здесь:

[d3 ] Псевдонимы: они могут скрывать исполняемый файл, но моя функция дает вам фактический путь к исполняемому файлу, только если он есть. Другие методы дадут вам определение псевдонима и вернут нулевой код выхода, независимо от того, существует ли за ним фактическая команда или нет. Улучшенная обработка ошибок: код выхода 127 означает «Не найденный» тип ошибок, поэтому вы можете иметь отдельную обработку ошибок, когда команда не найдена и когда возникает другая ошибка. Если есть некоторая невесомая ошибка (то есть неизвестная ошибка, кроме команды, которая не найдена), она не скрывает ее, вводя в заблуждение мышление gpg не существует, когда это возможно. Если вы хотите отбросить эти ошибки, вызовите его так: cmd_exists gpg 2>/dev/null

Примечания:

Что касается псевдонимов, это может быть или не быть тем, что вы хотите, например зная, что псевдоним существует, может быть достаточно для вас.

Unalias происходит внутри подоболочки, поэтому он не испортит псевдонимы вашей рабочей оболочки.

Что касается обработки ошибок, я не являюсь эксперт по сценариям оболочки, поэтому я не знаю, насколько вероятна ошибка в этой ситуации, и если есть лучший способ справиться с ними.

Так что будьте осторожны, это может быть излишним.

1
ответ дан 22 May 2018 в 20:20

Хотя принятое решение 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

Примечания:

Что касается псевдонимов, это может быть или не быть тем, что вы хотите, например зная, что псевдоним существует, может быть достаточно для вас.

Unalias происходит внутри подоболочки, поэтому он не испортит псевдонимы вашей рабочей оболочки.

Что касается обработки ошибок, я не являюсь эксперт по сценариям оболочки, поэтому я не знаю, насколько вероятна ошибка в этой ситуации, и если есть лучший способ справиться с ними.

Так что будьте осторожны, это может быть излишним.

1
ответ дан 18 July 2018 в 09:56

Это сделало бы трюк:

command -v gpg &>/dev/null && echo "gpg has been found at $(which gpg)" || { echo "Cound not find gpg. Aborting."; }
2
ответ дан 18 July 2018 в 09:56

Хотя принятое решение 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

Примечания:

Что касается псевдонимов, это может быть или не быть тем, что вы хотите, например зная, что псевдоним существует, может быть достаточно для вас.

Unalias происходит внутри подоболочки, поэтому он не испортит псевдонимы вашей рабочей оболочки.

Что касается обработки ошибок, я не являюсь эксперт по сценариям оболочки, поэтому я не знаю, насколько вероятна ошибка в этой ситуации, и если есть лучший способ справиться с ними.

Так что будьте осторожны, это может быть излишним.

1
ответ дан 24 July 2018 в 19:28

Другие вопросы по тегам:

Похожие вопросы: