4

我正在寻找一种解决方案(类似于下面的 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,但我还没有想出一个可行的解决方案。

有谁知道除了默认位置之外可以将所有输出重定向到文件的方法吗?

4

3 回答 3

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 重定向到不同的文件。

于 2012-08-23T10:23:49.300 回答
2

这个怎么样:

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

添加-atee命令行以便后续调用追加而不是覆盖。

于 2012-08-22T14:50:22.747 回答
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 回答