3
に線で、テキストファイルの行を読んでポータブルに、私は通常、このようなwhileループを実装する方法:ラインでbashの行のテキストファイルを処理するためのbash
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"
最後のループは新しいプロセスをフォークしません。 – PSkocik
自動的に生成されたファイル記述子がBash 4.1で登場しました。 OS XはBash(3.something)のアンティークバージョンを使用しています。だから問題は、システム間ではなくバージョン間の移植性に関するものです。 –
しかし、bashはPosixシェルではありません。 bashのバージョンやPOSIXシェルの他の実装(BSDのようなもの)に移植性の問題があります。標準的なリダイレクションに固執すると、移植性があり、サブプロセスをフォークしません。 –