23

引数からの入力を受け入れながら、システム コマンドから bash 関数に出力 (stdin および stdout) を送信する方法を教えてください。次の例のようなもの。誰かが私を正しい道に導くことができますか?

LogMsg()
{
  DateTime=`date "+%Y/%m/%d %H:%M:%S"`
  echo '*****'$DateTime' ('$QMAKESPEC'): '$1 >> "$LogFile"
  echo $DateTime' ('$QMAKESPEC'): '$1
}

# Already works
LogMsg "This statement is sent directly"

# Wish I could do this:
# Capture both stdout & stderr of a system function to the logfile
# I do not presume that any of the syntax that follows is good
make 2>&1 >(LogMsg)
4

6 に答える 6

25

これを行うには、readbash ビルトインを使用できます。

LogMsg()
{
  read IN # This reads a string from stdin and stores it in a variable called IN
  DateTime=`date "+%Y/%m/%d %H:%M:%S"`
  echo '*****'$DateTime' ('$QMAKESPEC'): '$IN >> "$LogFile"
  echo $DateTime' ('$QMAKESPEC'): '$IN
}

次に、パイプを使用します。

make 2>&1 | LogMsg

アップデート:

標準入力または引数を入力として使用できるようにするには (chepner のコメントに従って)、次のようにします。

LogMsg()
{
  if [ -n "$1" ]
  then
      IN="$1"
  else
      read IN # This reads a string from stdin and stores it in a variable called IN
  fi

  DateTime=`date "+%Y/%m/%d %H:%M:%S"`
  echo '*****'$DateTime' ('$QMAKESPEC'): '$IN >> "$LogFile"
  echo $DateTime' ('$QMAKESPEC'): '$IN
}
于 2012-08-10T16:30:10.977 に答える
0

回答を投稿してくれた人々に感謝します。メッセージごとに1回タイムスタンプを追加するバージョンを思いつきました。

#!/bin/bash
CURRENT_PID=$$
PROCESS_NAME=$(basename $0)

LOGFILE=/var/log/backup-monitor.log
function log_message {
  if [ -n "$1" ]; then
      MESSAGE="$1"
      echo -e "$(date -Iseconds)\t$PROCESS_NAME\t$CURRENT_PID\t$MESSAGE" | tee -a $LOGFILE
  else
      MESSAGE=$(tee)
      echo -e "$(date -Iseconds)\t$PROCESS_NAME\t$CURRENT_PID\t$MESSAGE" | tee -a $LOGFILE
  fi
}

log_message "Direct arguments are working!!"

echo "stdin also working" | log_message
于 2019-10-15T01:40:17.970 に答える
-2

これを行うには 2 つの方法があります。まず、bash ファイルを作成し、次のように結果を渡す方法が良いと思います。

make 2>&1 > ./LogMsg

2 番目の方法は、結果を引数として関数に渡すことです。

LogMsg $(make 2>&1)
于 2012-08-10T16:21:06.960 に答える