Так как bash
в любом случае не может хранить NUL-байты в своих переменных, вы всегда можете сделать:
IFS= read -rd '' var < file
в котором будет храниться содержимое файла до первого нулевого байта или конца файла, если в файле нет нулевых байтов (текстовые файлы по определению (по определению POSIX по крайней мере )не содержат байты NUL ).
Другим вариантом является сохранение содержимого файла в виде массива его строк (, включая разделитель строк, если он есть):
readarray array < file
Затем вы можете присоединиться к ним с помощью:
IFS=; var="${array[*]}"
Если вход содержит байты NUL, все, что находится после первого вхождения в каждой строке, будет потеряно.
В синтаксисе POSIX sh вы можете сделать:
var=$(cat < file; echo.); var=${var%.}
Мы добавляем .
, который затем удаляем, чтобы обойти тот факт, что подстановка команд удаляет все завершающие символы новой строки.
Если файл содержит байты NUL, поведение будет различаться в зависимости от реализации.zsh
— единственная оболочка, которая их сохранит. (это также единственная оболочка, которая может хранить байты NUL в своих переменных ). bash
и несколько других оболочек просто удаляют их, в то время как некоторые другие задыхаются от них и отбрасывают все после первого появления NUL.
Вы также можете хранить содержимое файла в какой-либо закодированной форме, например:
var=$(uuencode -m - < file)
И получить обратно с:
printf '%s\n' "$var" | uudecode
Или с NUL, закодированными как \0000
, чтобы иметь возможность использовать его в аргументах для printf %b
в bash
(, предполагая, что вы не используете локали с кодировкой BIG5, GB18030, GBK, BIG5 -HKCSC):
var=; while true; do
if IFS= read -rd '' rec; then
var+=${rec//\\/\\\\}\\0000
else
var+=${rec//\\/\\\\}
break
fi
done < file
А потом:
printf %b "$var"
, чтобы получить его обратно.
Как я проверял, это работает, когда я не использую опцию d, что означает значение по умолчанию.
setfacl -Rdm g :grouptoadd :rx /path/directory/ эта команда разрешает новые файлы в разрешении rx каталога.
setfacl -Rm g :grouptoadd :rx /path/directory/ эта команда разрешает группе grouptoadd просматривать и читать каталог
Вы устанавливаете ACL по умолчанию с помощью флага -d
, а не действующие ACL . ACL по умолчанию — это механизм для установки ACL для файлов и каталогов, созданных в каталоге, для которого вы устанавливаете ACL по умолчанию. Удалите параметр -d
, если хотите применить ACL к самому каталогу.
Если вы выполните getfacl
, вы увидите записи "по умолчанию". Я предлагаю прочитать больше о Linux ACL.
[lzap@x1 foreman-packaging-rpm]$ getfacl /tmp/test
# file: tmp/test
# owner: lzap
# group: lzap
user::rwx
group::rwx
other::r-x
[lzap@x1 foreman-packaging-rpm]$ setfacl -dm u:lzap:rx /tmp/test
[lzap@x1 foreman-packaging-rpm]$ getfacl /tmp/test
# file: tmp/test
# owner: lzap
# group: lzap
user::rwx
group::rwx
other::r-x
default:user::rwx
default:user:lzap:r-x
default:group::rwx
default:mask::rwx
default:other::r-x
[lzap@x1 foreman-packaging-rpm]$ setfacl -m u:lzap:rx /tmp/test
[lzap@x1 foreman-packaging-rpm]$ getfacl /tmp/test
# file: tmp/test
# owner: lzap
# group: lzap
user::rwx
user:lzap:r-x
group::rwx
mask::rwx
other::r-x
default:user::rwx
default:user:lzap:r-x
default:group::rwx
default:mask::rwx
default:other::r-x
Чтобы увидеть списки ACL по умолчанию в действии, просто создайте файл в каталоге с ACL по умолчанию. В моем случае touch /tmp/test/a_file
и он унаследует u:lzap:r-x
ACL.
Я считаю, что "grouptoadd" не имеет разрешения на выполнение в каталоге пути . Вы можете ls /path/directory/
только в том случае, если у вас есть разрешение на выполнение для всех каталогов, составляющих ваш путь.
Попробуйте $ getfacl /path
и убедитесь, что " grouptoadd " имеет разрешение на выполнение.
Если нет, вы можете просто добавить его:$ setfacl -m g:grouptoadd:x /path
.
Также используйте команду setfacl
без опции -d
.