После долгих чтений, проб и ошибок кажется, что при запуске скрипта от имени root отсутствует то, что переменная среды DBUS_SESSION_BUS_ADDRESS не установлена.Это должно быть установлено И UID изменен на пользовательский, прежде чем настройки gconf могут быть установлены.Это мой тестовый скрипт, который я использовал, чтобы опробовать его.Выполните один или другой системный вызов в конце, чтобы изменить порядок кнопок окна.Попробуйте скрипт как пользователь или как root (sudo), чтобы увидеть, что он работает.
#!/usr/bin/perl
use strict;
use warnings;
use POSIX;
# get the user's name (as opposed to root)
my $user_name = getlogin();
# get the uid of the user by name
my $user_uid = getpwnam($user_name);
print $user_name . ": " . $user_uid . "\n";
my %dbus;
# get the DBUS machine ID
$dbus{'machine_id'} = qx{cat /var/lib/dbus/machine-id};
chomp( $dbus{'machine_id'} );
# read the user's DBUS session file to get variable DBUS_SESSION_BUS_ADDRESS
$dbus{'file'} = "/home/" . $user_name . "/.dbus/session-bus/" . $dbus{'machine_id'} . "-0";
print "checking DBUS file: " . $dbus{'file'} . "\n";
if (-e $dbus{'file'}) {
open(my $fh, '<', $dbus{'file'}) or die "Cannot open $dbus{file}";
while(<$fh>) {
if ( /^DBUS_SESSION_BUS_ADDRESS=(.*)$/ ) {
$dbus{'address'} = $1;
print "Found DBUS address: " . $dbus{'address'} . "\n";
}
}
} else {
print "cannot find DBUS file";
}
# set the uid to the user's uid not root's
POSIX::setuid($user_uid);
# set the DBUS_SESSION_BUS_ADDRESS environment variable
$ENV{'DBUS_SESSION_BUS_ADDRESS'} = $dbus{'address'};
my $command1 = 'gconftool-2 --set "/apps/metacity/general/button_layout" --type string "menu:maximize,minimize,close"';
my $command2 = 'gconftool-2 --set "/apps/metacity/general/button_layout" --type string "menu:minimize,maximize,close"';
system($command1);
## or
#system($command2);
Примечание: получил хорошую информацию здесь .