为了逐行处理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] 举报,一经查实,本站将立刻删除。