Является ли ./*/ портативным? - PullRequest
5 голосов
/ 01 октября 2019

Я часто использую ./*/ в цикле for, например

for d in ./*/; do
  : # do something with dirs
done

, чтобы сопоставить все не скрытые каталоги в текущем рабочем каталоге, но я не совсем уверен, является ли это переносимым способомэто. В моей системе установлены bash, dash и ksh, и он работает со всеми, но поскольку POSIX spec ничего об этом не говорит (или говорит неявно, и я его пропустил), я думаю, что могу »не надейся на это. Я также проверил отчеты об ошибках POSIX , но безрезультатно, там также нет упоминаний об этом.

Зависит ли его поведение от реализации или от файловой системы? Я что-то здесь упускаю? Как я узнаю, портативна она или нет?

1 Ответ

6 голосов
/ 01 октября 2019

Краткий ответ: ДА

Длинный ответ:

Стандарт POSIX (от opengroup) гласит, что / будет совпадать только с косыми чертами в расширенном имени файла. Поскольку Unix / Linux не допускает / в имени файла, я считаю, что это безопасное предположение для систем Unix / Linux.

Из приведенного ниже выделенного текста, кажется, что даже дляВ системах, которые допускают / в имени файла, стандарт POSIX требует, чтобы / не было сопоставлено с таким файлом.

В Windows выглядит как / не допускается в имени файла, но я не специалист по Windows.

С Язык программирования оболочки § Шаблоны, используемые для расширения имени файла :

Символ косой черты в имени пути должен явно совпадать с использованием одной или нескольких косых черт в шаблоне;он не должен совпадать ни со специальными символами звездочки или знака вопроса, ни с выражением в скобках. Трещины в шаблоне должны быть определены до выражения в скобках;таким образом, косая черта не может быть включена в выражение скобки шаблона, используемое для расширения имени файла . ...

Дополнительное примечание - уточнение имени пути:

путь определен в 4.13, с явной ссылкой на путь с завершающимкосая черта в Общие понятия § Разрешение имени пути .

Имя пути, которое содержит хотя бы один не символ и заканчивается одним или несколькими конечными символами, не должноразрешаться успешно, если последний компонент имени пути перед последующими символами не указывает на существующий каталог или запись каталога, которая должна быть создана для каталога сразу после разрешения пути. Интерфейсы, использующие разрешение имен, могут указывать дополнительные ограничения, если имя пути, которое не содержит имени существующего каталога, содержит хотя бы один не символ и содержит один или несколько конечных символов.

...