Он ищет /tools/bin/env
в chroot
окружении -, так что все, что $LFS/tools/bin/env
будет оцениваться как...
Если этот файл/каталог отсутствует -и из вашего комментария, где вы говорите, что он не найден, когда вы пытаетесь выполнить ls
для него, он отсутствует -, то вы пропустили шаг или не не замечаю провала. Вернитесь к документам LFS и найдите, где это было скомпилировано/установлено/связано/и т. д., и подтвердите, что вы действительно выполнили эти шаги.
Нет удобного способа. Вот почему GNU находит добавленных -readable
и друзей.
Вы можете построить выражение, которое приблизительно соответствует проверке разрешений, перечислив группы, в которых состоит пользователь. Не проверено.
can_access="( -user $(id -u) -perm -0${oct}00 -o ("
for g in $(id -G); do
can_access="$can_access -group $g -o"
done
can_access="${can_access% -o} ) -perm -00${oct}0 -o -perm -000${oct} )"
find … $can_access -print
В некоторых случаях это не дает правильного результата, например, при наличии списков управления доступом или в крайних случаях, таких как -rw----r--
для отказа в доступе к группе. Вы можете проверить крайние случаи с помощью той же техники, что и выше, но выражение становится еще более сложным. Для списков контроля доступавам нужно вызвать инструмент, который их поддерживает.
Такие языки, как Perl и Python, обеспечивают легкий доступ как к функции access(2)
, так и к функциям find
. В Perl сFile::Find
и-r
/ -w
/ -x
(, которые используют эффективный uid и gid процесса Perl — используйте -R
/ -W
/ -X
для проверки с реальным uid/ gid, например access(2)
, и используйте прагмуfiletest 'access'
, если ваш Perl не слишком древний для поддержки таких вещей, как ACL):
use File::Find;
use filetest 'access';
find(sub { if (-r $_) { print "$_ is readable\n"; } }, '.');
В Python сos.walk
и os.access
(, которые используют настоящие uid и gid процесса Python, напримерaccess(2)
):
import os
for dirpath, dirnames, filenames in os.walk('.', ):
for filename in filenames:
filename = os.path.join(dirpath, filenames)
if os.access(filename, os.R_OK):
print(filename + ' is readable\n')
Единственный полностью надежный способ — попытаться открыть файл. Для этого требуется внешняя утилита, так что это будет медленнее. Для проверки читабельности обычного файла:
find … -exec sh -c 'exec 2>/dev/null; : <"$0"' {} \; …
Чтобы проверить возможность записи, используйте: >>"$0"
(это открывает файл для добавления, поэтому если файл недоступен для записи, он не будет работать, но на самом деле он ничего не изменяет и, в частности, не будет обновлять модификацию. время ). Чтобы проверить каталог на удобочитаемость, используйте ls -- "$0" >/dev/null
. Чтобы проверить исполняемость каталога, используйте cd -- "$0"
. Не существует пассивного теста на исполняемость обычного файла, возможность записи каталога или доступ к большинству не -обычных файлов.