
Мне нужно проверить права доступа к файлам каталогов /usr
, /tmp
, /var
и их содержимое подкаталогов. Я взял права доступа к файлам каталога и его подкаталогов в массиве отдельно для каждого из /usr
, /tmp
, и /var
:
fun() {
set -A PR_Uperm -- "/usr" `ls -lRt /bin|grep -v "total"|sed -e '1d' -e '/^$/d' -e '/^l/d'|awk '{print $1}'`
set -A PR_Tperm -- "/tmp" `ls -lRt /bin|grep -v "total"|sed -e '1d' -e '/^$/d' -e '/^l/d'|awk '{print $1}'`
fun2
}
Наконец, я хочу, чтобы эти отдельные массивы были в одном массиве, который находится в другой функции, поскольку у нас есть динамическая область видимости в скриптах. Я пробовал, как показано ниже:
fun2(){
set -A perm ${PR_Uperm[@]} ${PR_Tperm[@]}
}
При запуске скрипта возникает эта ошибка.
script.sh:79919: нижний индекс вне диапазона
когда я даю только один массивперманентная завивкамассив, как показано ниже, я не получаю никаких ошибок.
set -A perm ${PR_Tperm[@]}
Мне нужно сохранить так много записейперманентная завивкамассив. Как можно динамически увеличить размер массива?набор -Ане относится к bash, но это динамическое увеличение может быть одинаковым для bash и ksh, поэтому я его включил.
Я попробовал сохранить во временном файле, как показано ниже:
printf "/usr\n`ls -lRt /usr|grep -v "total"|sed -e '1d' -e '/^$/d' -e '/^l/d'|awk '{print $1}'`\n" >> /tmp/output2.txt # not working in ksh, but working when I run as bash
ksh: no space
ls -lRt /usr|grep -v "total"|sed -e '1d' -e '/^$/d' -e '/^l/d'|awk '{print $1}' >> /tmp/output2.txt # it is working
Почему первая команда успешно выполнилась в bash, но не в ksh?
решение1
Если я правильно помню, в Bash нет встроенного ограничения на размер массива. KornShell93 поддерживает индексы размером до 64k в последних версиях (и до 4095 в более старых версиях).
Существует утилита mtree
, которая используется для сравнения иерархии файлов со спецификацией. Любые отклонения от спецификации (отсутствующие файлы или каталоги, или несоответствия владения/разрешения) сообщаются и опционально исправляются (если это возможно).
Поскольку я не знаю, какой у вас Unix, я не могу подсказать вам, где найти эту утилиту. Она находится вБазовая система OpenBSD, но, очевидно, такжедоступно для Linux.