レガシーシステムの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)構文はタイピングのトンを保存することができので、私は、驚いた...
ああ、お待ちください。あなたは 'sed'への2つの引数ではなく、2つの異なる*プロセス置換が生成されることを期待していますか?私はこれが** **これまでの**正確な、文書化された振る舞いに沿ったものであるかどうかはわかりません。つまり、AFAIK、あなたのコードはバグに依存していました。 –
@CharlesDuffy - これは、bash4のアップグレードまで常に(私とスクリプトのために)うまくいっています - '<(cmd {a、b})'は '<(cmd a)<(cmd b)'に展開され、 /などに参加する。これらのスクリプトはこの機能を幅広く使用しており、複数のレベルにネストしてスクリプトをテストしています(私の太った指で触れて新しいエラーを生成したくない)。 – Vlad
@Vlad Bash 4で修正されたバグのようです。 '<(...)'の中のコマンドは他のコマンドと同じように解析されるはずですので、 '<(cmd {a、b} ) 'は' <(cmd ab) 'と同等でなければなりません。 – Barmar