Как я могу проверить команду перед каналом, записать ее вывод и понять, была ли команда выполнена успешно или нет - PullRequest
0 голосов
/ 24 декабря 2018

Я пишу скрипт, который будет автоматически выполнять команды на разных серверах, и я пытаюсь записать весь его контент и вывод.У меня проблемы с перенаправлениями и выводом статуса команды.Значение команды было успешным и каков ее вывод?

Я пробовал много направлений, таких как перенаправление вывода команды в функцию или файл.Я попробовал простое утверждение if.Оба работали на там уважаемую функцию.Но когда я пытаюсь объединить их оба, скрипт всегда возвращает команду, чтобы она была успешной.И до некоторого уровня это.

#!/bin/bash

function Executing(){
  if [ "$1" != "" ]; then
    if [ $DEBUG = "true" ]; then
      echo "$1" | Debug i s
      if $1 2>&1 | Debug o o;then
        echo "$1" | Debug s r
      else
        echo "$1" | Debug e r
      fi
    else
      eval $1
    fi
  fi
}

Executing "apt-get update"

Также обратите внимание, что системе требуется sudo для выполнения обновления apt-get.Таким образом, скрипт должен сообщать и регистрировать ошибку.Прямо сейчас, когда я вызываю функцию Executing, функция возвращает успешное выполнение.Я почти уверен, что это происходит из-за добавления канала | debug o o, который захватывает вывод и форматирует его.Который я позже перенаправлю в файл журнала.

Итак, я протестировал if apt-get update;then echo yes;else echo no; fi, который работал в моем терминале.Но как только я передаю вывод в функцию debug, оператор if возвращает true.

1 Ответ

0 голосов
/ 25 декабря 2018

Попробуйте с помощью set -o pipefail.

Проверьте руководство: Построение набора

Обычно bash возвращает код выхода последней команды группы каналов,поэтому ваша Debug команда была проверена.С этой настройкой bash возвращает статус выхода последней (самой правой) команды для выхода с ненулевым статусом.Если ваша команда терпит неудачу, то это статус, который распространяется.

...