[英]How to portable read a text file line by line in 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过程中的临时dup
处理。
随意使用标准的stdin / stdout重定向。 它并不比使用exec
内置的重定向更昂贵。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.