如何捕获shell脚本输出

如何捕获shell脚本输出,shell,unix,ksh,Shell,Unix,Ksh,我有一个unixshell脚本。我将-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; shell脚本的第一行被称为shebang,它指示执行下面的脚本必须执

我有一个unixshell脚本。我将
-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;

shell脚本的第一行被称为shebang,它指示执行下面的脚本必须执行的解释器

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

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

ksh -x scriptname >> output_file 

注意:它将逐行输出脚本所做的事情。有两种情况,使用
ksh
作为shell,然后您需要相应地执行IO重定向,使用其他shell并执行
.ksh
脚本,然后可以基于该shell执行IO重定向。以下方法适用于大多数壳

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

printf "Copy file \n";
printf "Do something else \n";
运行它:

$ ./somescript.ksh 1>some.log 2>&1
$ ./myscript 1>/path/to/logfile 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
运行它:

$ ./somescript.ksh 1>some.log 2>&1
$ ./myscript 1>/path/to/logfile 2>&1

2>&1
stderr
stdout
捕获到
stdout
1>日志文件
打印到
logfile
我更愿意显式重定向输出(包括stderr
2>
,因为
set-x
将输出发送到stderr)

这使得shebang很短,您不必将重定向和文件名构建塞进其中

#!/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"

#!bin/ksh-x>$Logfile Logfile=path.log.date打印“复制文件”| tee-a$logifle Scp-i密钥源目标| tee-a$Logfile。出口0;以上是对的吗?或者我需要删除tee命令
Logfile=path.log.date
是一个bug。shell中的赋值中不能有空格。它应该是
Logfile=path.log.date
。这不是你真正的剧本,是吗?(你也有一些区分大小写的问题)好的,谢谢,其余的都是好看的吗?谢谢。实际上我想创建一个shell脚本和我们的行。ed.sh在control-m命令中如何添加1 some.log 2&;1在controlm命令行中使用after.sh。请提供帮助。谢谢。如何在control-m命令行中使用这个stderr和stout。因为我想在control-m-job中使用,所以我对
control-m-job
一无所知。你可以单独问这个问题。如果您使用的是
ksh
或任何shell,那么命令行本身应该是独立的。请参阅: