如何在bash中保存返回码和子函数的日志

时间:2016-10-26 09:38:09

标签: bash

我想运行一个子功能(通过读取等一些交互式操作)并保留它的日志。

原始

#!/bin/bash
foo() {
  echo "Error"
  return 1
}
bar() {
  local data
  read -p "data=" data
  echo "OK: $data"
  return 0
}
foo 
echo "Return code=$?"
bar
echo "Return code=$?"

保留日志后

#!/bin/bash
foo() {
  echo "Error"
  return 1
}
bar() {
  local data
  read -p "data=" data
  echo "OK: $data"
  return 0
}
LOG=my.log
foo | tee -a $LOG
echo "Return code=$?"
bar | tee -a $LOG
echo "Return code=$?"

2 个答案:

答案 0 :(得分:0)

使用命名管道发送返回值:

#!/bin/bash
foo() {
  echo "Error"
  return 1
}
bar() {
  echo "OK"
  return 0
}

rm -f retcode
trap 'rm -f retcode' EXIT
mkfifo retcode

LOG=my.log
{
     foo
     echo $? > retcode
} | tee -a $LOG &
read rc < retcode
echo "Return code=$rc"
{
    bar
    echo $? > retcode
} | tee -a $LOG &
read rc < retcode
echo "Return code=$rc"

答案 1 :(得分:0)

使用流程替换来运行tee。这利用了>(...)内的进程的返回码丢失的事实。

#!/bin/bash
foo() {
  echo "Error"
  return 1
}
bar() {
  echo "OK"
  return 0
}
LOG=my.log
foo > >(tee -a $LOG )
echo "Return code=$?"
bar > >( tee -a $LOG )
echo "Return code=$?"