bash 3.00.15(1) の場合:
$ ls /proc/self/fd 4<&1
0 1 2 3 4
$ echo | ls /proc/self/fd 4<&1
0 1 2 3 4
$ ls() { /bin/ls $*; }
$ ls /proc/self/fd 4<&1
0 1 2 3 4
$ echo | ls /proc/self/fd 4<&1 # Unexpected output
0 1 2 3
これは bash のバグのようです。これは、dash と zsh での動作が異なるためです (bash での動作は私が期待するものではありません)。複製された記述子を 5 に変更すると、最終的な出力は期待どおりになります。
この動作を引き起こすために何が起こっているかについて何か考えはありますか?