簡體   English   中英

如何在管道之前測試命令,捕獲其輸出並了解命令是否成功運行

[英]How can I test a command before a pipe, capture it's output and understand if the command ran successfully or not

我正在編寫一個腳本,該腳本將自動在不同的服務器上執行命令,並且試圖記錄所有內容和輸出。 我在重定向和命令狀態輸出方面遇到困難。 意思是命令成功了,它的輸出是什么?

我已經嘗試了許多方向,例如將命令輸出重定向到函數或文件。 我嘗試了一個簡單的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 oo | debug oo捕獲輸出並將其格式化。 我稍后將其重定向到日志文件。

所以我測試了if apt-get update;then echo yes;else echo no; fi if apt-get update;then echo yes;else echo no; fi在我的終端機上工作過 但是,只要將輸出通過管道傳遞給函數debug,if語句就會返回true。

嘗試使用set -o pipefail

檢查手冊: 內置內置

通常,bash返回管道組的最后一個命令的退出代碼,因此您的Debug命令就是已檢查的命令。 使用該設置,bash返回最后一個(最右邊)命令的退出狀態,以非零狀態退出。 如果您的命令失敗,那就是傳播的狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM