1

bash スクリプトで奇妙な問題が発生しています。それを再現するための最小限のコードは次のとおりです。

#!/bin/bash

function f() {
    IFS=. read a b <<<"$1"
    echo "a=$a b=$b"
}

f a.b
echo "inside echo: `f a.b`"
cat <<EOT
Inside heredoc: `f a.b`
EOT

予想される出力は次のとおりです。

a=a b=b
inside echo: a=a b=b
Inside heredoc: a=a b=b

しかし、私は得る:

a=a b=b
inside echo: a=a b=b
Inside heredoc: a=a.b b=

ここで何が欠けていますか?

更新: 私の Mac (3.2.48) の bash は期待どおりに動作します。私のdebian安定版(4.2.37(1)リリース)のbashは、説明されている奇妙さをもたらします。

4

1 に答える 1

1

これは、ローカル環境の変更がヒア文字列と相互作用する方法のバグであり、次期バージョン 4.3 で修正されています。

# bash 3.2
% bash tmp.bash
a=a b=b
inside echo: a=a b=b
Inside heredoc: a=a b=b

# bash 4.2
% /usr/local/bin/bash tmp.bash
a=a b=b
inside echo: a=a b=b
Inside heredoc: a=a.b b=

# bash 4.3, release candidate
% bash/bash tmp.bash
a=a b=b
inside echo: a=a b=b
Inside heredoc: a=a b=b
于 2014-04-01T19:06:30.247 に答える