微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux-如何在bash中逐行可移植地读取文本文件

为了逐行处理bash中的文本文件,我通常实现while循环,如下所示:

function doSomething() {
    local inputFile="$1"
    local fd=""
    local line=""
    exec {fd}<"$inputFile" # open file
    echo "Opened ${inputFile} for read using descriptor ${fd}"
    while IFS='' read -r -u $fd line || [[ -n "$line" ]]; do
        echo "read = \"$line\""
    done
    exec {fd}<&- # close file
    return 0
}

这在我的Linux上有效,但是不幸的是在OSX上无效.对于OSX,我目前必须将代码更改为如下所示:

exec 3<"$inputFile" # open file
while IFS='' read -r -u 3 line || [[ -n "$line" ]]; do
    echo "read = \"$line\""
done
exec 3<&- # close file

但这有一个缺点,那就是我必须自己管理文件描述符编号(在第一个脚本中,我让bash选择一个可用的文件描述符编号).

有人为此提供了适用于Linux和OSX的解决方案吗?

请注意,由于某种原因,我不想使用管道或I / O重定向到这样的完整循环(因为我不想在其他进程中执行循环):

while IFS='' read -r line || [[ -n "$line" ]]; do
    echo "read = \"$line\""
done < "$inputFile"

解决方法:

最后一个循环不会派生新进程.您可以通过在循环内外打印“ $BASHPID”来进行验证.

仅为管道创建新过程.简单的重定向由bash进程中的临时dups处理.

随意使用标准的stdin / stdout重定向.它比使用exec内置完成重定向更昂贵.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐