Como você descobriu, dbus-launch
cria um novo daemon D-Bus toda vez que é executado. Você pode usar dbus-launch
e matá-lo quando terminar:
# Make the function
GSET () {
sudo -u mango DBUS_SESSION_BUS_ADDRESS="$DBUS_SESSION_BUS_ADDRESS" gsettings set "$1" "$2" "$3"
}
# Launch the daemon
. <(sudo -u mango dbus-daemon --sh-syntax)
# Run as many commands as you need
GSET x1 y1 z1
GSET x2 y2 z2
...
# Kill the daemon
sudo -u mango kill "$DBUS_SESSION_BUS_PID"
Você poderia usar uma abordagem transacional baseada em shell para evitar chamar sudo
repetidamente. Algo como:
script=$(mktemp gset-transaction.XXXXXXXXXX)
create_transaction () {
printf '. <(dbus-launch --sh-syntax)\n' > "$script"
}
GSET () {
printf 'gsettings set "%s" "%s" "%s"\n' "$1" "$2" "$3" >> "$script"
}
commit_transaction () {
printf 'kill "$DBUS_SESSION_BUS_PID"\n' >> "$script"
sudo -u mango bash -c "$script"
# optionally:
# rm "$script"
}
create_transaction
GSET x1 y1 z1
GSET x2 y2 z2
...
commit_transaction