我想从 shell 脚本中运行一个程序(执行时会生成日志数据)并将输出写入文本文件。我没能做到:/
$prog 是执行的 prog -> socat/dev/ttyUSB0,b9600 STDOUT
$log/$FILE 只是 .txt 文件的路径
我有一个 Perl 脚本来执行此操作:
open (S,$prog) ||die "Cannot open $prog ($!)\n";
open (R,">>","$log") ||die "Cannot open logfile $log!\n";
while (<S>) {
my $date = localtime->strftime('%d.%m.%Y;%H:%M:%S;');
print "$date$_";
}
我尝试在这样的 shell 脚本中执行此操作
#!/bin/sh
FILE=/var/log/mylogfile.log
SOCAT=/usr/bin/socat
DEV=/dev/ttyUSB0
BAUD=,b9600
PROG=$SOCAT $DEV$BAUD STDOUT
exec 3<&0
exec 0<$PROG
while read -r line
do
DATE=`date +%d.%m.%Y;%H:%M:%S;`
echo $DATE$line >> $FILE
done
exec 0<&3
根本不起作用...
如何读取该程序的输出并使用 shell 脚本将其通过管道传输到我的文本文件中?我做错了什么(如果我没有做错所有事情)?
<小时/>最终代码:
#!/bin/sh
FILE=/var/log/mylogfile.log
SOCAT=/usr/bin/socat
DEV=/dev/ttyUSB0
BAUD=,b9600
CMD="$SOCAT $DEV$BAUD STDOUT"
$CMD |
while read -r line
do
echo "$(date +'%d.%m.%Y;%H:%M:%S;')$line" >> $FILE
done
最佳答案
要从进程中读取数据,请使用进程替换
exec 0< <( $PROG )
/bin/sh
不支持,因此请使用 /bin/bash
。
要将多个单词分配给变量、引号或反斜杠空格:
PROG="$SOCAT $DEV$BAUD STDOUT"
分号在 shell 中是特殊的,引用它或反斜杠它:
DATE=$(date '+%d.%m.%Y;%H:%M:%S;')
此外,不需要执行人员:
while ...
...
done < <( $PROG )
您甚至可以在 done
之后添加 > $FILE
,而不是将每一行单独添加到文件中。
关于linux - 读取 shell 脚本中的行输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31641460/