Я запускаю Ubuntu как VM в VMware Fusion на MacPro:
ayakovlev@ubuntu:~$ uname -a
Linux ubuntu 3.11.10.3 #1 SMP Thu Mar 6 15:31:54 EST 2014 x86_64 x86_64 x86_64 GNU/Linux
Команда ниже производит результат, который я ожидаю:
ayakovlev@ubuntu:~$ ls /usr/include/*5*
ax25.h
Когда я заменяю 5
6
Я получаю очень странные результаты:
ayakovlev@ubuntu:~$ ls /usr/include/*6*
a.out.h asm bits c++ fpu_control.h gnu ieee754.h sys zconf.h
Какова могла бы быть причина этого?
Как @Sparhawk объясненный, то, что происходит, - то, что Вы перечисляете содержание каталогов. Это не будет зависеть от *, отклоняют Вас, используют, насколько я знаю, это - поведение по умолчанию GNU ls
. Реализации неGNU могут отличаться, но я сомневаюсь относительно этого.
Когда Вы выполняете эту команду:
ls /usr/include/*6*
Шарик (*6*
) расширен Вашей оболочкой (удар, например) перед вызовом ls
. Так, учитывая следующую структуру каталогов:
.
├── dir1
│ ├── file1
│ └── file2
└── dir2
├── file1
└── file2
ls d*
будет расширен до ls dir1 dir2
, и дайте результаты, которые Вы ожидаете:
dir1:
file1 file2
dir2:
file1 file2
Это то, как ls
соглашения с несколькими целевыми каталогами по умолчанию, это перечисляет каждый найденный каталог и затем содержание того каталога. Однако при выполнении его на единственном каталоге имя не печатается:
$ ls d*1
file1 file2
Так, с тех пор существует только одно соответствие для шарика *6*
в /usr/include
и то соответствие является каталогом, Вы работаете ls
с единственным каталогом, как введено и, поэтому, это перечисляет содержание каталога без включения имени каталога.
Подстановочные знаки в ls /usr/include/*6*
расширяются до любых соответствий. В первом случае это соответствовало определенным регулярным файлам. Однако, если это будет соответствовать каталогам такой как /usr/include/x86_64-linux-gnu
, это распечатает содержание тех каталогов вместо этого (т.е. это расширилось бы до ls /usr/include/x86_64-linux-gnu
).
можно проверить, что подстановочный знак расширился бы до каталога с ls /usr/include | grep 6
.