4

Solaris の ksh 内の画面に加えて、stdout と stderr の両方をファイルにコピーするソリューション (以下の bash コードに類似) を探しています。

次のコードは、bash シェルでうまく機能します。

#!/usr/bin/bash

# Clear the logfile
>logfile.txt

# Redirect all script output to a logfile as well as their normal locations
exec >  >(tee -a logfile.txt)
exec 2> >(tee -a logfile.txt >&2)
date
ls -l /non-existent/path

何らかの理由で、Solaris で構文エラーがスローされます。プロセスの置換ができないためだと思いますmkfifo.

デフォルトの場所に加えて、すべての出力をファイルにリダイレクトできる方法を知っている人はいますか?

4

3 に答える 3

3

どのバージョンの ksh を使用していますか? これ>()は ksh88 ではサポートされていませんが、ksh93 ではサポートされています。ksh93 では、bash コードは変更されずに (#!行を除いて) 動作するはずです。

ksh88 で行き詰まっている場合 (残念なことに!)、名前付きパイプを使用して bash/ksh93 の動作をエミュレートできます。

#!/bin/ksh 
# Clear the logfile  
>logfile.txt  

pipe1="/tmp/mypipe1.$$"
pipe2="/tmp/mypipe2.$$"
trap 'rm "$pipe1" "$pipe2"' EXIT
mkfifo "$pipe1"
mkfifo "$pipe2"
tee -a logfile.txt < "$pipe1" &
tee -a logfile.txt >&2 < "$pipe2" &

# Redirect all script output to a logfile as well as their normal locations  
exec >"$pipe1"
exec 2>"$pipe2"

date   
ls -l /non-existent/path  

上記は、stderr を別のファイルにリダイレクトできるようにするための 2 番目のバージョンです。

于 2012-08-23T10:23:49.300 に答える
1

kshでは、以下は私にとって非常にうまく機能します

LOG=log_file.$(date +%Y%m%d%H%M%S).txt
{
ls
date
... whatever command
} 2>&1 | tee -a $LOG
于 2014-11-15T16:53:18.537 に答える