Como remover o elemento da matriz gsettings no script?

2

O array em dbus / gsettings tem um formato [element1, element2, element3, ...] .

A interface

Gsettings 'permite apenas substituir a matriz existente por outra, portanto, por exemplo, adicionar outro elemento de item pode ser obtido da seguinte forma:

#!/bin/bash
gsettings get ${schema} ${key} | grep -q \"${value}\" >/dev/null
if [ $? -ne 0 ]; then
   gsettings set ${schema} ${key} \"'gsettings get ${schema} ${key} | sed s/.$//', ${value}]\"
fi

Alguém pode me ajudar com um script, que verifica se pelo menos um elemento existe que corresponda ao regex e, em caso afirmativo, analisa o gsettings array string, and removes all matching elements (and puts it back with gsettings set ', mas isso é trivial).

Eu tentei encontrar essa ferramenta, mas não consegui encontrar uma. Eu não posso acreditar, que ninguém ainda tinha necessidade de tal ferramenta ...

A questão complementa Como adicionar um elemento ao array gsettings no local específico (dado pelo índice)?

    
por Adam Ryczkowski 28.04.2014 / 20:03

1 resposta

3

Usar bash para essa tarefa deve ser possível, mas eu prefiro fazer manipulações complexas de array com um script Python3:

#!/usr/bin/env python3

import argparse
import subprocess
import sys

parser = argparse.ArgumentParser()
parser.add_argument("schema", help="gsettings shema", metavar="SCHEMA")
parser.add_argument("key", help="gsettings key", metavar="KEY")
parser.add_argument("values",
                    help="gsettings value(s) to remove from the KEY array",
                    metavar="VALUE", nargs='*')
args = parser.parse_args()

array = eval(subprocess.check_output(["gsettings", "get", args.schema, args.key]))
for v in args.values:
    try:
        value = eval(v)
    except:
        value = v
    try:
        array.remove(value)
    except ValueError:
        print("Warning: {} not in {} {}".format(value, args.schema, args.key), file=sys.stderr)
subprocess.call(["gsettings", "set", args.schema, args.key, str(array)])

Esse script permite que vários valores sejam removidos ao mesmo tempo do esquema / chave passado para o script.

    
por Sylvain Pineau 28.04.2014 / 22:12