Как вернуть восьмеричное значение из арифметического расширения Bash?

  1. Да, и это, вероятно, самый быстрый и простой способ, если все, что вас интересует, это mdadmпрограммный рейд (, а не lvmили btrfsи т. д. )-, но имена рейдовых устройств произвольны (, так что вы не можете просто предположить, что они будут соответствовать^md[0-9]+-большинство из них, но они не обязаны, и стандарт/стандарт по умолчанию может измениться в будущем ).

    Кстати, вот парсер python /proc/mdstat:https://github.com/truveris/py-mdstat/(, который включает в себя mdjsonинструмент для печати /proc/mdstatв формате json)

    Это был только первый, который я нашел в Google, наверняка есть и другие для perl, awkи других языков.

    А вот очень быстрый -и -грязный awkодин -лайнер, который определяет наличие каких-либо рейд-устройств (, предполагая, что если второе поле любой строки ввода после первой строки двоеточие :, то это указывает на рейд-устройство):

    awk 'NR > 1 && $2 == ":" {found++}; END {exit !found}' /proc/mdstat

    Завершается с true (0 ), если найдено одно или несколько устройств, иначе false.

  2. Personalitiesпросто перечисляет типы mdadmрейдов, поддерживаемые ядром. Это не указывает на то, что ЛЮБОЙ из них активно используется, просто в ядре есть необходимый драйвер, скомпилированный в (или загруженный модуль )

  3. .
  4. Конечно, почему бы и нет. Если они не делают ничего полезного, нет необходимости их запускать или даже устанавливать.

1
08.06.2019, 04:10
1 ответ

Вот любопытный момент, который я обнаружил в комментарии в другой ветке SE:вы можете просто использовать printfсо строкой формата%o(восьмеричной ).

Рабочий пример:

# figure out stat(1) flags based on OS
if [[ $(uname -s) == Linux ]]; then PERMS='-c %a' else PERMS='-f %Lp'; fi

stat $PERMS ~/.my.cnf
# result: 600 (not group/world readable)

# permission bits if group/world readable
bitmask=044
perm=$(stat $PERMS ~/.my.cnf)
printf "%o\n" $(( 0$perm & 0$bitmask ))
# result: 0

# now make the file group-readable and try again
chmod 640 ~/.my.cnf
perm=$(stat $PERMS ~/.my.cnf)
printf "%o\n" $(( 0$perm & 0$bitmask ))
# result: 40

Бонус :другие решения

Если я не хочу видеть биты прав доступа в восьмеричном формате, я могу достичь своей первоначальной цели, вообще не используя printf. Если меня волнует только то, были ли установлены какие-либо биты в bitmask, достаточно просто проверить, не равен ли результат -нулю:

if (( 0$perm & 0$bitmask )); then
    echo "Permissions $perm are too lax." >&2
fi

Если вы хотите узнать, были ли установлены все биты в bitmask, сравните результат их объединения И с битовой маской, примерно так:

(( (0777 & 0066) == 0066 )) && echo "Oh noes, group AND world writable! "
1
27.01.2020, 23:41

Теги

Похожие вопросы