web-dev-qa-db-ja.com

スクリプトでgsettings配列から要素を削除する方法は?

Dbus/gsettingsの配列の形式は[element1, element2, element3, ...]

Gsettings 'インターフェイスでは、既存の配列を別の配列に置き換えることのみが許可されているため、たとえば、次のように別のアイテム要素を追加できます。

#!/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

正規表現に一致する要素が少なくとも1つ存在するかどうかを確認し、存在する場合はgsettingsarray string, and removes all matching elements (and puts it back withgsettings set`、しかしそれは簡単です)。

そのようなツールを見つけようとしましたが、見つけられませんでした。誰もまだそのようなツールを必要としていないとは信じられません...


特定の場所でgsettings配列に要素を追加する方法(インデックスで指定)?

2
Adam Ryczkowski

このタスクにbashを使用することは可能ですが、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)])

このスクリプトにより、スクリプトに渡されるスキーマ/キーから複数の値を同時に削除できます。

3
Sylvain Pineau