linux - 读取 shell 脚本中的行输出

标签 linux bash shell sh

我想从 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/

相关文章:

string - 在shell脚本中获取子字符串

linux - 当你想运行后台任务时,linux命令 "screen"和 "&"有什么区别?

python - 多进程写入python中的一个管道

bash - bash 是否在值周围添加隐式引号?

linux - Unix bash shell 脚本 - 在 'for' 循环中迭代数组

linux - Shell 脚本错误处理

linux - 如何查找特定文件在给定时间范围内被修改的次数

linux - 奇怪的错误 8 - Centos 6.4 上的幽灵博客

git - bash PS1 中的动态元素

Android:亚行拒绝连接到客户端