Почему использование двойных скобок «[[» для проверки существования файлов, соответствующих подстановочным знакам, не работает, в то время как одинарные скобки «[» работают?

Wheezy и Jessie недавно были удалены из зеркальной сети , поэтому, если вы хотите продолжить получение бэкпортов Jessie, вам нужно вместо этого использовать archive.debian.org:

deb [check-valid-until=no] http://archive.debian.org/debian jessie-backports main

(Необходимо отключить проверку достоверности, так как репозиторий больше не обновляется. aptДжесси не поддерживает флаг check-valid-until, подробности см. в ответе Иностии , а также сводную информацию о конфигурации ниже в этом ответе.)

Репозиторий jessie-updatesудален :все обновления объединены с основным репозиторием, и больше не будет обновлений безопасности, отличных от -. Поэтому любые ссылки на jessie-updatesв файлах sources.listили sources.list.dнеобходимо удалить. Обновления безопасности будут по-прежнему предоставляться для поддерживаемых LTS -архитектур в репозитории безопасности до 30 июня 2020 г.

Поскольку вы создаете образ контейнера, я настоятельно рекомендую вместо него использовать Debian 9 (Stretch ). Чтобы остаться на Debian 8 (Jessie ), ваши репозитории в конечном итоге должны выглядеть как

deb http://cdn-fastly.deb.debian.org/debian/ jessie main
deb-src http://cdn-fastly.deb.debian.org/debian/ jessie main

deb http://security.debian.org/ jessie/updates main
deb-src http://security.debian.org/ jessie/updates main

deb http://archive.debian.org/debian jessie-backports main
deb-src http://archive.debian.org/debian jessie-backports main

(без репозитория jessie-updates).

Вам также потребуется отключить проверку достоверности в /etc/apt/apt.conf(, которая будет применяться ко всем репозиториям):

Acquire::Check-Valid-Until "false";

-1
11.07.2020, 02:47
1 ответ

Условный оператор -eпроверяет, существует ли файл с заданным именем. Он не выполняет никакого сопоставления с образцом. [[ -e fileclass1*1.txt ]]проверяет, существует ли файл с именем fileclass1*1.txtс буквальной звездочкой в ​​имени, а не есть ли хотя бы один файл, соответствующий шаблону подстановки fileclass1*1.txt.

С одной квадратной скобкой [ ! -e $name ], поскольку $nameне заключен в кавычки, значение nameподвергается подстановке подстановочных знаков и разбиению на слова. Если значение nameравно Directory1/fileclass1*1.txt, эффект зависит от того, сколько файлов соответствует шаблону подстановки.

  • Если шаблон не соответствует ни одному файлу, он остается нераскрытым. Затем оператор -eвидит имя файла Directory1/fileclass1*1.txt, которого не существует, поэтому [ ! -e $name ]верно.
  • Если шаблон соответствует одному файлу, он заменяется именем этого файла. Затем оператор -eвидит это имя файла, которое существует¹, поэтому [ ! -e $name ]ложно.
  • Если шаблон соответствует двум или более файлам, он заменяется списком совпадающих имен файлов, что приводит к синтаксической ошибке в условном выражении. В этом случае [ ! -e $name ]отображает сообщение об ошибке и возвращает статус ошибки.

Эффект от [[ -e $name ]]отличается, потому что [[ … ]]— это специальный синтаксис (, тогда как [— это обычная команда, аргументы которой раскрываются нормально ). Внутри [[ … ]]не выполняется разделение слов или расширение подстановочных знаков.

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

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

4
18.03.2021, 23:20

Теги

Похожие вопросы