tl;dr -Расширение Bash сложно для предотвращения бесконечных циклов символических ссылок (в bash >= 4.3
), и вы и я неправильно истолковали, что оно делает в командах, которые вы разместили
Я предполагаю, что у вас есть bash >= 4.3
, поскольку я не могу воспроизвести то, что вы описываете в bash 4.2.46
, он зацикливается, пока не достигнет предела рекурсии (, как и ожидалось ).
Некоторое время смотрел на это и настроил тестовый каталог для воспроизведения, который имитировал вашу ситуацию. Суть в том, как расширение bash происходит в каждом из ваших примеров.Расширение ведет себя по-разному в зависимости от того, следует ли за ним /
, и у нас, приматов, возникает некоторый когнитивный диссонанс в этом отношении, когда мы смотрим на подобные примеры.
Из документации на баш шопт:
globstar
If set, the pattern ‘**’ used in a filename expansion context will match all files and zero or more directories and subdirectories. If the pattern is followed by a ‘/’, only directories and subdirectories match.
Чтобы проиллюстрировать, вот моя тестовая установка:
$ mkdir -p test/nested
$ cd test
$ touch sneaky
$ touch nested/sneaky
$ cd nested
$ ln -s. looper
$ cd..
что приводит к такой структуре каталогов:
test/
- sneaky
- nested/
- sneaky
- looper ->./
Это дублирует ваши выводы в моем тестовом каталоге:
$ for apath in../**/sneaky; do echo "$apath"; done
../test/nested/looper/sneaky
../test/nested/sneaky
../test/sneaky
$ printf "%s\n"../** | grep sneaky
../test/nested/sneaky
../test/sneaky
В первом примере глобус расширяется до (test/nested/looper, test/nested, test)
, останавливаясь на looper
без перехода по ссылке, поскольку за глобусом следует/
Затем мы добавляем /sneaky
к этому, в результате чего получается набор (test/nested/looper/sneaky, test/nested/sneaky, test/sneaky)
.
Во втором примере глобус расширяется до (test/nested/looper, test/nested/sneaky, test/nested, test/sneaky, test)
(, в чем можно убедиться, удалив| grep sneaky
)
Опять же, это разложение не следует за ссылкой looper
, но в этом случае мы не добавляем к нему /sneaky
, таким образом исключая ../test/nested/looper/sneaky
из наших результатов.
С другой стороны, мы продолжаем получать ../test/nested/sneaky
и ../test/sneaky
, потому что glob также захватывает файлы, когда за ним не следует/
Даже если вы sudo
подключитесь к своей системе (легко ), это не поможет. Для работы необходимо установить root -. И вы не можете настроить это без root-доступа.
Если запуск команд без sudo
не работает, значит, в Dockerfile есть строка USER
. Если вы отредактируете Dockerfile, поместивapt-get
(или команды для установкиapt-get
)перед этой строкой, тогда он сможет установить (, вы все равно будете пользователем root ).