将stderr和stdout复制到文件以及ksh中的屏幕

时间:2012-08-22 14:36:34

标签: shell ksh io-redirection

我正在寻找一种解决方案(类似于下面的bash代码),除了Solaris上的ksh中的屏幕外,还将stdout和stderr复制到一个文件中。

以下代码在bash shell中运行良好:

#!/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,但我还没有提出一个有效的解决方案。

除了默认位置之外,有没有人知道所有输出都可以重定向到文件的方式?

3 个答案:

答案 0 :(得分:3)

您使用的是哪个版本的ksh? ksh88不支持>(),但在ksh93中受支持 - bash代码应该在ksh93上保持不变(除#!行之外)。

如果您遇到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重定向到另一个文件。

答案 1 :(得分:2)

这个怎么样:

(some commands ...) 2>&1 | tee logfile.txt

-a添加到tee命令行,以便后续调用进行追加而不是覆盖。

答案 2 :(得分:1)

在ksh中,以下对我来说效果很好

LOG=log_file.$(date +%Y%m%d%H%M%S).txt
{
ls
date
... whatever command
} 2>&1 | tee -a $LOG