2017-03-16 23 views
6

レガシーシステムの1つがbash4にアップグレードされ、ほとんどのスクリプトが機能しなくなりました。私は中括弧がどのようにして<(cmdA ...|cmdB ... file{1,2}|cmdZ ...)の中に展開されているかに絞り込んだ。なぜbash4が中括弧を別々に展開するのですか?

より良い違いを説明するために:

(bashの3.2.25)の前に:(bashの4.1.2)AFTER

[[email protected]:~]$ bash -version|head -1 
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu) 
[[email protected]:~]$ cat <(echo sort file{1,2}) 
sort file1 
sort file2 
[[email protected]:~]$ join <(sed 's/\r//g;s/^[^:]*://' file{1,2}|LANG=C sort) 
[[email protected]:~]$ 

を:

[[email protected]:~]$ bash --version|head -1 
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu) 
[[email protected]:~]$ cat <(echo sort file{1,2}) 
sort file1 file2 
[[email protected]:~]$ join <(sed 's/\r//g;s/^[^:]*://' file{1,2}|LANG=C sort) 
join: missing operand after `/dev/fd/63' 
Try `join --help' for more information. 
[[email protected]:~]$ 

それは「ハードですbash4のために作られた "コード化された"(そして期待される?)あるいは、この拡張の動作は、いくつかのbashレベルの設定(例えばset -B/set +B)によって制御され、古い/レガシー/ bash3モードに戻すことができますか?私はむしろ(スクリプトの山を書き直す代わりに)いくつかのシェル全体の切り替えを変更するだろう。この(bash3)「機能」はバグ修正や改良の際に切断された場合は

- 旧(bash3)構文はタイピングのトンを保存することができので、私は、驚いた...

+3

ああ、お待ちください。あなたは 'sed'への2つの引数ではなく、2つの異なる*プロセス置換が生成されることを期待していますか?私はこれが** **これまでの**正確な、文書化された振る舞いに沿ったものであるかどうかはわかりません。つまり、AFAIK、あなたのコードはバグに依存していました。 –

+0

@CharlesDuffy - これは、bash4のアップグレードまで常に(私とスクリプトのために)うまくいっています - '<(cmd {a、b})'は '<(cmd a)<(cmd b)'に展開され、 /などに参加する。これらのスクリプトはこの機能を幅広く使用しており、複数のレベルにネストしてスクリプトをテストしています(私の太った指で触れて新しいエラーを生成したくない)。 – Vlad

+3

@Vlad Bash 4で修正されたバグのようです。 '<(...)'の中のコマンドは他のコマンドと同じように解析されるはずですので、 '<(cmd {a、b} ) 'は' <(cmd ab) 'と同等でなければなりません。 – Barmar

答えて

4

元の動作でした文書化されていない(そして、サブシェルや同様の文脈のようなプロセス置換に囲まれたコードは、それが同じ外で振る舞うのと同じ方法で解析するという一般的な規則に反して)。

このように、これはバグであり、機能ではありません。このバグはbash-4.0-alphaで修正されました。 CHANGESエントリの引用:

rr。ブレースの拡張により、プロセスの置換が変更されずに通過するようになりました。

この変更を元に戻すための実行時フラグはありません。

+1

私はその間に同じ方向に掘り下げていましたが、別の影響を受けたユーザー(http://wiki.bash-hackers.org/syntax/expansion/brace)が見つかりました。その後、同じエントリがCHANGESにあり、すべてのgitコミットが見つかりました"bash-20080724スナップショットをコミットする"。私の目標を簡単にするために、私はボックスのカスタムbash4を再コンパイルし、優先度の変更を元に戻してからスクリプトを再チェックします。私の目標を単純化するためにランタイムフラグに晒されていなかったのは残念です。私はすべての答えをupvoteしていただきありがとうございます! – Vlad

関連する問題