Графический интерфейс Zenity для chattr и lsattr

Описание:

Здравствуйте, Stackers! В настоящее время я создаю графический интерфейс zenity для команды chattr. Я пытаюсь показать и изменить атрибуты файла, используя zenity --list --checklist, чтобы отметить атрибуты, которые мне нужны, но главная проблема, с которой я столкнулся, заключается в том, что я не знаю, каков порядок из lsattr вывода, например: -------------e-- file

Пример кода:

attr=("A" "Solo escritura" "a" "No actualizar" "c" "Comprimido" "C" "No copiar en escritura" "D" "Actualización de directorio sincrónica" "d" "Ignorar en backup" "E" "Error de compreción" "e" "Usando extents" "h" "Archivo enorme" "I" "Indexación hashed trees" "i" "Archivo inmutable" "j" "Registro de datos" "s" "Borrado seguro" "S" "Actualización sincrónica" "T" "Directorio tope" "t" "Archivo sin cola" "u" "Deshacer borrado" "X" "Acceso crudo dec compreción" "Z" "Archivo comprimido sucio" "-v" "Generar verción de archivo")

fileattr=$(lsattr "$file") ; j=0 ; k=1

for (( i=1; i<=15; i++ )); do
    [[ "${fileattr:$i:1}" != "-" ]] && values+="true ${attr[$j]} ${attr[$k]//' '/_} " && setted+="${attr[$j]} " ||\
    values+="false ${attr[$j]} ${attr[$k]//' '/_} "
    ((j+=2)) ; ((k+=2))
done

zenity --list --checklist --column="Estado" --column="Atributo" --column="Descripción" ${values}

Объяснение кода:

  1. attr представляет собой массив и упорядочен с использованием этой страницы.
  2. Цикл for выполняется 15 раз (это равно количеству атрибутов файла, возвращаемых lsattr), и на каждом этапе он проверяет не установленные атрибуты "-", если атрибут установлен, то добавляет "true attr[j] attr[k ]" к values и добавьте атрибут к setted (для дальнейших целей) или добавьте "false attr[j] attr[k]" к values
  3. Наконец позвоните zenity с собранными values

Запуск вывода:

окно Zenity говорит мне, что атрибут "s" установлен, но это не так, потому что выход lsattr равен -------------e-- file. Я заметил, что на странице больше атрибутов, чем на странице lsattr.

Примечание.

Я знаю, может быть, я использую неправильный подход, поэтому, если вы можете найти лучший способ сделать это, я весь внимание.

Спасибо.


person Basher SG    schedule 13.11.2017    source источник


Ответы (1)


Ассоциативные массивы будут полезны в этой задаче.

Давайте определим список всех возможных атрибутов:

valueList=acdeijstuACDST

Давайте определим ассоциативный массив для хранения значений:

declare -A valueMap

Инициализируйте карту со всеми значениями false для всех атрибутов:

for ((i = 0; i < ${#valueList}; i++)); do
    name=${valueList:i:1}
    valueMap[$name]=false
done

Прокрутите символы в fileattr, чтобы обновить значения в карте до true:

for ((i = 0; i < 16; i++)); do
    name=${fileattr:i:1}
    [[ $name != - ]] && valueMap[$name]=true
done

Объедините valueMap и ваш исходный attr, чтобы создать массив значений для передачи в Zenity:

zenityValues=()
for ((i = 0; i < ${#attr[@]}; i+=2)); do
    name=${attr[i]}
    description=${attr[i+1]}
    zenityValues+=(${valueMap[name]} "$name" "$description")
done

И, наконец, вызовите Zenity, как и вы, но передав zenityValues в виде массива:

zenity ... "${zenityValues[@]}"
person janos    schedule 13.11.2017
comment
Это работает как шарм, я не знал, что bash поддерживает ассоциативные массивы, но немного разочаровывает то, что для их заполнения требуется цикл for, также я не знал, что использование массива для заполнения столбцов zenity позволит вы используете пробелы, это блестяще. - person Basher SG; 13.11.2017