Если вы используете bash
, просто:
shopt -s globstar # to match files recursively
cat -- **/*.tcl
Хорошо, я понял. Вызов debootstrap
действительно указывал на сбой, возвращая код выхода 1. Я пропустил это из-за того, что я связывал несколько команд и использовал подоболочки.
Как только я понял это, мне нужно было выяснить, с какой проблемой debootstrap
я столкнулся. Это не было очевидно из/debootstrap/debootstrap.log
(внутри мишени ), хотя задним числом это было очевидно. Так что мне нужно было самоанализ debootstrap
. Чтобы сделать это, я вызвал скрипт оболочки /usr/sbin/debootstrap
явно через /bin/sh -x
(, чтобы включить трассировку ), и вывод можно увидеть внутри/debootstrap/debootstrap.log
(внутри цели ). В моем случае проблема была mknod
, как показано этой записью трассировки и выводом:
+ mknod -m 666 /target/dev/null c 1 3
mknod: '/target/dev/null': File exists
, что, в свою очередь, было вызвано тем, что я установил /dev
, /proc
и /sys
в мишень впереди(то, что работало в прошлом! ).
В новых debootstrap
версиях это кажется безусловным сбоем. Соответствующая функция, вызывающая mknod
, — это setup_devices_simple
из /usr/share/debootstrap/functions
.
Одно заметное изменение, которое я заметил при сравнении debootstrap
сценариев для 1.0.59
и1.0.89~bpo8+1
(и последующих версий ), заключалось в том, что вызов функции setup_devices
переместился из функции second_stage_install
в функцию first_stage_install
(. сценария gutsy
). Эта функция вызывает setup_devices_simple
, если только не выполняется вариант fakechroot
или работа на «чужом» ядре, и поэтому вызывает mknod
несколько раньше, чем раньше.
Причина, по которой это раньше не давало сбоев, похоже, заключается в том, что в прошлом устройства хранились внутри файла.tgz и распаковывались на место, тогда как теперь debootstrap
использует mkdnod
напрямую.