Как добавить элемент в массив gsettings в определенном месте (по индексу)?

Я хочу написать скрипт, который переводит правила окна devilspie в правила compiz. Настройки Compiz можно изменить с помощью клавиш gsettings в пути org.compiz.profiles.unity.plugins.place. Есть три клавиши: viewport-matches, viewport-x-values и viewport-y-values. К сожалению, каждый ключ является массивом, и индекс элементов имеет значение.

Gsettings не хватает какой-либо поддержки array типов, кроме перезаписи всего массива сразу, и мне нужно поместить элемент в массив в определенном месте (скажем, в начале, индекс '1') .

Я знаю, что если меня не волнует индекс, я могу использовать

gsettings set ${schema} ${key} \"`gsettings get ${schema} ${key} | sed s/.$//`, ${value}]\"

Вопрос дополняет Как удалить элемент из массива gsettings в скрипте?

2
задан 13 April 2017 в 15:23

2 ответа

Следующий python3 сценарий вставит новый элемент (элементы) в данном индексе:

#!/usr/bin/env python3

import argparse
import subprocess

parser = argparse.ArgumentParser()
parser.add_argument("schema", help="gsettings shema", metavar="SCHEMA")
parser.add_argument("key", help="gsettings key", metavar="KEY")
parser.add_argument("index",
                    help="KEY array index where VALUE(s) need to be inserted",
                    metavar="INDEX", type=int)
parser.add_argument("value",
                    help="gsettings VALUE(s) to add to the KEY array",
                    metavar="VALUE", nargs='*')

args = parser.parse_args()

array = eval(subprocess.check_output(["gsettings", "get", args.schema, args.key]))
for v in sorted(args.value, reverse=True):
    try:
        value = eval(v)
    except NameError:
        value = v
    array.insert(args.index, value)
subprocess.call(["gsettings", "set", args.schema, args.key, str(array)])
0
ответ дан 13 April 2017 в 15:23

Можно также сделать это с помощью сценария удара:

#!/bin/bash

SCHEMA="your.wanted.schema"
KEY="your-wanted-key"

STATUS=$(gsettings get ${SCHEMA} ${KEY})

# Optional proof, whether value to add already exsists
if [[ $STATUS == *"'to.add.value'"* ]]; then
    echo "to.add.value is already in the list!"
else
    gsettings set ${SCHEMA} ${KEY} "${STATUS%]*}, 'to.add.value']"
    echo "Added to.add.value to the list."
fi
0
ответ дан 14 April 2017 в 01:23
  • 1
    @alain, Если Вы имеете 000 в каталоге, никто не может считать файлы в этом, потому что каталог содержит отображение между именем-файла-inode всех файлов в том каталоге.. – heemayl 12 November 2015 в 12:51

Другие вопросы по тегам:

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