Я считаю, что сборка в chroot
проверит, что все вспомогательные файлы и программы для сборки GCC и GlibC присутствует и не зависит от «системы сборки». Обычно компиляция компилятора совсем не проста. Я считаю, что GCC потребует bison
и flex
и всевозможные файлы заголовков, файлы конфигурации и бог знает что еще. Сборка chroot
- это просто промежуточный шаг между системой сборки (которая не является LFS) и окончательной установкой LFS, которая должна быть самостоятельной.
Поскольку среда выполнения GCC сложна ( PATH
, LD_LIBRARY_PATH
и другие элементы конфигурации), также возможно, что некоторые побочные эффекты будут просачиваться из исходного компилятора GCC. Я не могу найти эту статью, но помню, что может потребоваться до 5 поколений компиляции компилятора с ранее скомпилированным поколением, чтобы выявить все странные ошибки и зависимости.
Просто используйте для строки, разделенной запятыми, продолжайте добавлять индекс ваших файлов к переменной и распечатывайте переменную
for((i=1; i<=30; i++))
do
name="File${i}.exe"; [[ ! -e "$name" ]] && files="$files$i,"
done
echo $files | sed s/,$//
Или вы можете сохранить значения в массиве/списке
arr=()
for((i=1; i<=30; i++))
do
name="File${i}.exe"; [[ ! -e "$name" ]] && arr+=($i)
done
(IFS=, ; echo "${arr[*]}") #to print the array with comma as separator
Использование /bin/sh
и списка позиционных параметров для хранения имен отсутствующих файлов:
set --
i=1
while [ "$i" -le 1000 ]; do
name="File.$i.exe"
[[ ! -e "$name" ]] && set -- "$@" "$name"
i=$(( i + 1 ))
done
( IFS=','; printf 'Missing files: %s\n' "$*" )
или используя bash
и массив:
missing=()
for (( i=1; i<=1000; ++i )); do
name="File.$i.exe"
[[ ! -e "$name" ]] && missing+=( "$name" )
done
( IFS=','; printf 'Missing files: %s\n' "${missing[*]}" )
При использовании "$*"
или "${missing[*]}"
массив будет преобразован в строку. Строка будет объединена с первым символом $IFS
в качестве разделителя (по умолчанию пробел ). Подоболочка устанавливает IFS
в запятую, а затем печатает массив, соединенный запятыми. Подоболочка предотвращает установку переменной IFS
в остальной части скрипта.
Код также сможет работать с именами файлов, содержащими пробелы и т. д.
Используйте инструмент paste
, просто добавьте | paste -sd,
в цикл:
for((i=1; i<=1000; i++))
do
name="File.${i}.exe"; [[ ! -e "$name" ]] && echo "$i"
done | paste -sd,
Пояснение:
paste - merge lines of files
paste [OPTION]... [FILE]...
With no FILE, or when FILE is -, read standard input.
-s
:вставлять по одному файлу вместо параллельного -d
:разделитель(,
в данном случае)