复制stderr和标准输出到一个文件中,以及在KSH屏幕(Copy stderr and stdou

2019-07-31 03:12发布

我正在寻找一个解决方案(类似于下面的bash的代码)标准输​​出和标准错误除了KSH内Solaris上的复制到文件屏幕。

下面的代码在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 ,但是我还没有想出一个可行的解决方案。

有谁知道,所有的输出可以在除默认位置被重定向到一个文件的方式?

Answer 1:

哪个版本的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  

以上是第二版本,以使标准错误被重定向到不同的文件。



Answer 2:

这个怎么样:

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

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



Answer 3:

在KSH,以下工作对我非常好

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


文章来源: Copy stderr and stdout to a file as well as the screen in ksh