2016-06-22 3 views
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" 
+2

最後のループは新しいプロセスをフォークしません。 – PSkocik

+2

自動的に生成されたファイル記述子がBash 4.1で登場しました。 OS XはBash(3.something)のアンティークバージョンを使用しています。だから問題は、システム間ではなくバージョン間の移植性に関するものです。 –

+2

しかし、bashはPosixシェルではありません。 bashのバージョンやPOSIXシェルの他の実装(BSDのようなもの)に移植性の問題があります。標準的なリダイレクションに固執すると、移植性があり、サブプロセスをフォークしません。 –

答えて

3

最後のループは新しいプロセスをフォークしません。 "$BASHPID"をループの内側と外側に印刷することで確認できます。

新しいプロセスはパイプラインに対してのみ作成されます。単純なリダイレクトは、bashプロセス内の一時的なdupによって処理されます。

標準的なstdin/stdoutリダイレクトを自由に使用できます。これは、組み込みのexecで行われたリダイレクトよりも高価ではありません。

関連する問題