避免打印“Tee”跟踪线

避免打印“Tee”跟踪线

我在脚本中有以下内容:

#!/bin/bash

logFile='script.log'
echo -n > $logFile
log="tee -a $logFile"

set -x
scp ... user@host:...
ssh user@host "
  echo '...message...'
  " 2>&1 | $log
{ set +x ;} 2> /dev/null  # avoids trace output of '++ set +x'

输出是:

++ ssh user@host '
  echo '\''> ...message...'\''
  '
++ tee -a script.log
> ...message...

++ tee ...跟踪线也可以以某种方式被抑制吗?

答案1

您可以仅对适当的命令启用跟踪,而不是对整个管道进行跟踪。多命令管道中的每个命令都在其自己的子 shell 执行环境中运行(当该lastpipe选项有效时,Bash 中的最后一个命令除外),并且set可以对每个命令应用不同的选项。

例如,稍微概括一下你的代码,没有+tee打印出来

$ set -x; echo foo | tee; { set +x; } 2>/dev/null
+ echo foo
+ tee
foo

一个简单的方法可能是

$ { set -x; echo foo; } | tee
+ echo foo
foo

答案2

感谢弗拉桑为了他的回答埃德·莫顿他的评论问题

我最终得到了一个具有log函数和重载代码行较少的解决方案:

log() {
  tee -a "$logFile"
  }

logFile='script.log'
> $logFile

{
set -x
scp ...
ssh ...
} 2>&1 | log

相关内容