/dev/fd
— это не фиксированный каталог, а символическая ссылка, указывающая на каталог для каждого -процесса. В ваших двух вызовах ls
вы перечисляете содержимое двух разных «каталогов».
Ваш первый вывод дает файловые дескрипторы, связанные с ls
. Второй вывод дает файловые дескрипторы, связанные с bash
. echo
и exec
, предшествующие спискам каталогов, не меняют этого.
Рассмотрим:
foo:~$ ls -ln /dev/fd/
total 0
lrwx------ 1 1000 1000 64 Jul 10 12:13 0 -> /dev/pts/19
lrwx------ 1 1000 1000 64 Jul 10 12:13 1 -> /dev/pts/19
lrwx------ 1 1000 1000 64 Jul 10 12:13 2 -> /dev/pts/19
lr-x------ 1 1000 1000 64 Jul 10 12:13 3 -> /proc/20115/fd
foo:~$ cat /dev/fd/../cmdline && echo
cat/dev/fd/../cmdline
foo:~$ cd /dev/fd ; ls -ln
total 0
lrwx------ 1 1000 1000 64 Jul 8 05:01 0 -> /dev/pts/19
lrwx------ 1 1000 1000 64 Jul 8 05:01 1 -> /dev/pts/19
lrwx------ 1 1000 1000 64 Jul 8 05:01 2 -> /dev/pts/19
lrwx------ 1 1000 1000 64 Jul 8 05:01 255 -> /dev/pts/19
foo:/dev/fd$ cat../cmdline && echo
bash
foo:/dev/fd$ pwd -P
/proc/2689/fd