「ティー」トラッキングラインの印刷を防ぐ

「ティー」トラッキングラインの印刷を防ぐ

私のスクリプトには次のものがあります。

#!/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

パイプライン全体を追跡するのではなく、適切なコマンドに対してのみトレースを有効にできます。マルチコマンドパイプラインの各コマンドは、独自のサブシェル実行環境で実行されます(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

関連情報