如何捕获shell脚本输出

时间:2018-02-15 14:00:28

标签: shell unix ksh

我有一个unix shell脚本。我已将-x放在shell中以查看所有执行步骤。现在我想每天在一个日志文件中捕获它们。 Psb脚本。

#!/bin/ksh -x   
Logfile= path.log.date    
Print " copying file" | tee $logifle     
Scp  -i key source destination | tee -a $logfile.    
Exit 0;

3 个答案:

答案 0 :(得分:1)

shell脚本的第一行称为 shebang ,它表示解释器必须执行以下脚本。

类似地,第一行被评论,表示与该解释会话无关的后续行。

要捕获输出,请在运行脚本时运行脚本重定向输出。

first_highest<-t(sapply(CEPH, function(x) {t_x <- sort(table(x), decreasing=TRUE); list(value=names(t_x)[1],freq=t_x[1])}))
second_highest<-t(sapply(CEPH, function(x) {t_x <- sort(table(x), decreasing=TRUE); list(value=names(t_x)[2],freq=t_x[2])}))

frequeny<-cbind(first_highest,second_highest)

注意:它会输出您的脚本逐行执行的操作

答案 1 :(得分:0)

有两种情况,使用ksh作为您的shell,然后您需要相应地执行IO重定向,并使用其他一些shell并执行.ksh脚本,然后可以基于以下方式完成IO重定向那个壳。以下方法适用于大多数shell。

$ cat somescript.ksh
#!/bin/ksh -x

printf "Copy file \n";
printf "Do something else \n";

运行它:

$ ./somescript.ksh 1>some.log 2>&1

some.log将包含

+ printf 'Copy file \n'
Copy file 
+ printf 'Do something else \n'
Do something else 

在您的情况下,无需指定logfile和/或tee。脚本看起来像这样,

#!/bin/ksh -x      
printf "copying file\n"    
scp -i key user@server /path/to/file   
exit 0

运行它:

$ ./myscript 1>/path/to/logfile 2>&1

2>&1stderrstdout同时捕获到stdout1>logfile将其打印到logfile

答案 2 :(得分:0)

我更希望显式重定向输出(包括stderr 2>,因为set -x将输出发送到stderr。)

这使shebang保持简短,你不必将redirecton和filename-build填入其中。

#!/bin/ksh
logfile=path.log.date
exec >> $logfile 2>&1  # redirecting all output to logfile (appending)
set -x               # switch on debugging
# now start working
echo "print something"