ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2019-11-18 13:51:13  阅读:166  来源: 互联网

标签:bash linux macos


为了逐行处理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内置完成重定向更昂贵.

标签:bash,linux,macos
来源: https://codeday.me/bug/20191118/2028620.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有