Эта команда показывает сообщение об ошибке «ERROR: extract: путь должен быть абсолютным»:
./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers
Ошибка не помогает - программа тоже смущен уже. Вы уже знаете, что ошибка происходит от ~, поскольку она работает с $HOME.
Проблема: ~ заменяется только в начале слова.
Например, это работает с тильдой:
echo -extract ~/Downloads
Если вам нужен синтаксис опции с =, то использование $ HOME вместо ~ является самым чистым решением ;
echo -extract=$HOME/Downloads
Что вы должны знать:
Существуют особые случаи, когда ~ get расширяется, если не в начале слова: как часть присваивания переменной, непосредственно после =. Это, конечно, запутывает.
Другой важный частный случай для использования с такими переменными, как PATH. В переменных присваивания ~ также расширяется после :, как и после первого =.
$ dir=~ sh -c 'echo D2: $dir'
D2: /home/user
$ sh -c 'echo D2: $dir' dir=~
D2:
$ echo Dir: $dir
Dir:
$ dir=~; sh -c 'echo D2: $dir'
D2:
$ echo Dir: $dir
Dir: /home/user
$ sh -c 'echo D2: $dir'; d3=~
D2:
$ echo d3: $d3
d3: /home/user
В оболочке [ f16], тильда, на самом деле не путь.
Это что-то вроде сокращения или сокращения, предоставленного оболочкой. Он не может быть использован как путь вообще, оболочка «расширяет» его до пути только в очень особых местах. И даже если он расширен, это может быть что-то другое, чем домашний каталог.
Он расширяется только в начале слова или в присваивании переменной после : или =. Он расширяется только в том случае, если он не внутри кавычек. Он расширяется только до $HOME если в слове нет дополнительных символов до /В соответствии с этим проблема в вашей команде заключается в том, что тильда в
-extract=~/Downloads/nvidia_installers
не расширяется, потому что это не один из перечисленных случаев. Это все.
Решение может состоять в том, чтобы сделать тильду первым неупорядоченным символом слова без какого-либо другого символа перед следующим / - это именно то, что вы получаете, когда используете параметр с space перед аргументом опции:
-extract ~/Downloads/nvidia_installers
Другим решением было бы использовать $HOME. В сценарии это обычно лучший выбор.
-extract=$HOME/Downloads/nvidia_installers
Но как сообщение об ошибке "ERROR: extract: path must be absolute."?
Мы знаем, что тильда не расширилась. Это означает, что программа получила текст аргумента, включая ~, но без /home/auser в качестве пути. Этот путь ~/Downloads/nvidia_installers - но теперь нет оболочки, поэтому тильда не имеет особого значения. Это просто обычное имя каталога. И как любой другой путь формы foo/bar/baz, это относительный путь
Если после ~ есть символы, как в ~alice - с все другие правила выше применения - и есть имена пользователей alice, которые вместо этого добавляются в домашний каталог alice, скажем home/alice. Кроме того, если вы bob , ~ будет расширяться до /home/bob, а ~bob будет расширяться до того же самого.
Вариант ~+ расширяется до текущего каталога, $PWD
Чтобы ссылаться на предыдущий каталог, где вы были до последнего cd, вы можете использовать ~-, который расширен до $OLDPWD.
Если вы используете pushd и popd вместо cd вы уже знаете, что к стеку каталога можно получить доступ, например ~-2.
Все случаи, когда ~ расширяются до пути, рукояткой оболочки. Для других программ ~ является обычным символом имени файла.
Для помещены оболочкой внутри оболочки, вот соответствующий раздел man bash. Обратите внимание, что замена ~ на $HOME - это только один частный случай многие случаи: «Если это имя для входа является пустой строкой, тильда заменяется значением параметра оболочки HOME.»:
Tilde Expansion
If a word begins with an unquoted tilde character (`~'), all of the charac‐
ters preceding the first unquoted slash (or all characters, if there is no
unquoted slash) are considered a tilde-prefix. If none of the characters
in the tilde-prefix are quoted, the characters in the tilde-prefix follow‐
ing the tilde are treated as a possible login name. If this login name is
the null string, the tilde is replaced with the value of the shell parame‐
ter HOME. If HOME is unset, the home directory of the user executing the
shell is substituted instead. Otherwise, the tilde-prefix is replaced with
the home directory associated with the specified login name.
If the tilde-prefix is a `~+', the value of the shell variable PWD replaces
the tilde-prefix. If the tilde-prefix is a `~-', the value of the shell
variable OLDPWD, if it is set, is substituted. If the characters following
the tilde in the tilde-prefix consist of a number N, optionally prefixed by
a `+' or a `-', the tilde-prefix is replaced with the corresponding element
from the directory stack, as it would be displayed by the dirs builtin
invoked with the tilde-prefix as an argument. If the characters following
the tilde in the tilde-prefix consist of a number without a leading `+' or
`-', `+' is assumed.
If the login name is invalid, or the tilde expansion fails, the word is
unchanged.
Each variable assignment is checked for unquoted tilde-prefixes immediately
following a : or the first =. In these cases, tilde expansion is also per‐
formed. Consequently, one may use filenames with tildes in assignments to
PATH, MAILPATH, and CDPATH, and the shell assigns the expanded value.
Решение, с которым я столкнулся, - это события DBUS.
Сначала я запускал dbus-monitor, чтобы увидеть, какие события вызывают, когда монитор идет / просыпается от сна:
signal time=1515274499.244468 sender=org.freedesktop.DBus -> destination=:1.394 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
string ":1.394"
signal time=1515274499.244502 sender=org.freedesktop.DBus -> destination=:1.394 serial=4 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameLost
string ":1.394"
signal time=1515274559.337480 sender=:1.6 -> destination=:1.2 serial=29015 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 440
signal time=1515274559.337878 sender=:1.2 -> destination=(null destination) serial=3288 path=/org/gnome/SessionManager/Presence; interface=org.gnome.SessionManager.Presence; member=StatusChanged
uint32 3
signal time=1515274559.338267 sender=:1.2 -> destination=(null destination) serial=3290 path=/org/gnome/SessionManager/Presence; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.SessionManager.Presence"
array [
dict entry(
string "status"
variant uint32 3
)
]
array [
]
signal time=1515274569.389778 sender=:1.6 -> destination=(null destination) serial=29018 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "auto-move-windows@gnome-shell-extensions.gcampax.github.com"
int32 2
string ""
signal time=1515274569.398929 sender=:1.6 -> destination=(null destination) serial=29019 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "clipboard-indicator@tudmotu.com"
int32 2
string ""
signal time=1515274569.399633 sender=org.freedesktop.DBus -> destination=:1.6 serial=5195 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameLost
string "org.kde.StatusNotifierWatcher"
signal time=1515274569.399660 sender=org.freedesktop.DBus -> destination=(null destination) serial=850 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
string "org.kde.StatusNotifierWatcher"
string ":1.6"
string ""
signal time=1515274569.404274 sender=:1.6 -> destination=(null destination) serial=29022 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "ubuntu-appindicators@ubuntu.com"
int32 2
string ""
signal time=1515274569.442137 sender=:1.6 -> destination=(null destination) serial=29025 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "ubuntu-dock@ubuntu.com"
int32 2
string ""
signal time=1515274569.455035 sender=:1.6 -> destination=(null destination) serial=29027 path=/org/gnome/ScreenSaver; interface=org.gnome.ScreenSaver; member=ActiveChanged
boolean true
signal time=1515274569.657300 sender=:1.6 -> destination=:1.42 serial=29037 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 491
signal time=1515274569.657404 sender=:1.6 -> destination=(null destination) serial=29038 path=/org/gnome/Mutter/DisplayConfig; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.Mutter.DisplayConfig"
array [
dict entry(
string "PowerSaveMode"
variant int32 3
)
]
array [
]
signal time=1515276608.243100 sender=:1.6 -> destination=:1.2 serial=29039 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 489
signal time=1515276608.243573 sender=:1.2 -> destination=(null destination) serial=3291 path=/org/gnome/SessionManager/Presence; interface=org.gnome.SessionManager.Presence; member=StatusChanged
uint32 0
signal time=1515276608.243843 sender=:1.2 -> destination=(null destination) serial=3292 path=/org/gnome/SessionManager/Presence; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.SessionManager.Presence"
array [
dict entry(
string "status"
variant uint32 0
)
]
array [
]
signal time=1515276608.244032 sender=:1.6 -> destination=:1.42 serial=29040 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 494
signal time=1515276608.270459 sender=:1.6 -> destination=(null destination) serial=29042 path=/org/gnome/Mutter/DisplayConfig; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.Mutter.DisplayConfig"
array [
dict entry(
string "PowerSaveMode"
variant int32 0
)
]
array [
]
signal time=1515276623.523917 sender=:1.6 -> destination=:1.42 serial=29043 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 491
signal time=1515276623.554451 sender=:1.6 -> destination=(null destination) serial=29047 path=/org/gnome/Mutter/DisplayConfig; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.Mutter.DisplayConfig"
array [
dict entry(
string "PowerSaveMode"
variant int32 3
)
]
array [
]
signal time=1515276668.529836 sender=:1.6 -> destination=:1.2 serial=29048 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 440
signal time=1515276668.530236 sender=:1.2 -> destination=(null destination) serial=3293 path=/org/gnome/SessionManager/Presence; interface=org.gnome.SessionManager.Presence; member=StatusChanged
uint32 3
signal time=1515276668.530565 sender=:1.2 -> destination=(null destination) serial=3295 path=/org/gnome/SessionManager/Presence; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.SessionManager.Presence"
array [
dict entry(
string "status"
variant uint32 3
)
]
array [
]
signal time=1515279067.394398 sender=:1.6 -> destination=:1.2 serial=29051 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 498
signal time=1515279067.394982 sender=:1.2 -> destination=(null destination) serial=3296 path=/org/gnome/SessionManager/Presence; interface=org.gnome.SessionManager.Presence; member=StatusChanged
uint32 0
signal time=1515279067.395139 sender=:1.2 -> destination=(null destination) serial=3297 path=/org/gnome/SessionManager/Presence; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.SessionManager.Presence"
array [
dict entry(
string "status"
variant uint32 0
)
]
array [
]
signal time=1515279067.395662 sender=:1.6 -> destination=:1.42 serial=29052 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 496
signal time=1515279067.414904 sender=:1.6 -> destination=(null destination) serial=29054 path=/org/gnome/Mutter/DisplayConfig; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.Mutter.DisplayConfig"
array [
dict entry(
string "PowerSaveMode"
variant int32 0
)
]
array [
]
signal time=1515279076.828255 sender=:1.6 -> destination=(null destination) serial=29063 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "ubuntu-dock@ubuntu.com"
int32 1
string ""
signal time=1515279076.829775 sender=org.freedesktop.DBus -> destination=(null destination) serial=851 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
string "org.kde.StatusNotifierWatcher"
string ""
string ":1.6"
signal time=1515279076.829812 sender=org.freedesktop.DBus -> destination=:1.6 serial=5215 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
string "org.kde.StatusNotifierWatcher"
signal time=1515279076.829824 sender=:1.6 -> destination=(null destination) serial=29066 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "ubuntu-appindicators@ubuntu.com"
int32 1
string ""
signal time=1515279076.841923 sender=:1.6 -> destination=(null destination) serial=29067 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "clipboard-indicator@tudmotu.com"
int32 1
string ""
signal time=1515279076.844396 sender=:1.6 -> destination=(null destination) serial=29068 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "auto-move-windows@gnome-shell-extensions.gcampax.github.com"
int32 1
string ""
signal time=1515279076.851323 sender=:1.6 -> destination=(null destination) serial=29069 path=/org/gnome/ScreenSaver; interface=org.gnome.ScreenSaver; member=ActiveChanged
boolean false
signal time=1515279076.896958 sender=:1.6 -> destination=(null destination) serial=29218 path=/StatusNotifierWatcher; interface=org.kde.StatusNotifierWatcher; member=StatusNotifierItemRegistered
string "/"
signal time=1515279076.921110 sender=:1.38 -> destination=(null destination) serial=2735 path=/org/gnome/evolution/dataserver/CalendarView/1887/93; interface=org.gnome.evolution.dataserver.CalendarView; member=complete
array [
string ""
string ""
]
signal time=1515279076.924727 sender=:1.34 -> destination=(null destination) serial=2701 path=/org/gnome/evolution/dataserver/CalendarView/1870/92; interface=org.gnome.evolution.dataserver.CalendarView; member=complete
array [
string ""
string ""
]
signal time=1515279077.686970 sender=:1.6 -> destination=(null destination) serial=30014 path=/StatusNotifierWatcher; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.kde.StatusNotifierWatcher"
array [
dict entry(
string "RegisteredStatusNotifierItems"
variant array [
string ":1.66/org/ayatana/NotificationItem/software_update_available"
]
)
]
array [
Я сначала попытался перейти на org.gnome.Mutter.IdleMonitor, но значения uint32 постоянно увеличивались, не зная почему?
Я установил с StatusChanged, вот окончательный скрипт:
#!/bin/bash
# Turn keyboard backlight on/off using https://github.com/MatMoul/g810-led
g413-led -a FFFFFF # always turn on on startup (it turns off for some reason on reboot)
dbus-monitor --session "type=signal,interface=org.gnome.SessionManager.Presence,member=StatusChanged" |
while read x; do
case "$x" in
*"uint32 3"*) g413-led -a 000000;;
*"uint32 0"*) g413-led -a FFFFFF;;
esac
done
[d4 ] Заставки также могут работать: g413-led -a FFFFFF # always turn on on startup (it turns off for some reason on reboot)
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" |
while read x; do
case "$x" in
*"boolean true"*) g413-led -a 000000;;
*"boolean false"*) g413-led -a FFFFFF;;
esac
done
Конечно, вы можете поместить любую команду. Преимущество первого скрипта по сравнению с этим состоит в том, что он загорается клавиатурой перед входом пользователя, что упрощает ввод пароля.
Единственным недостатком является то, что клавиатура загорается после входа пользователя, а не нажатия клавиши, но я могу жить с этим.
Я экспериментировал с:
dbus-monitor --session "type='signal',interface='org.freedesktop.DBus.Properties',path='/org/gnome/Mutter/DisplayConfig'" | grep 'variant int32' |
while read x; do
case "$x" in
*"variant int32 3"*) g413-led -a 000000;;
*"variant int32 0"*) g413-led -a FFFFFF;;
esac
done
, но по какой-то причине он не работал, возможно, проблема grep.
Решение, с которым я столкнулся, - это события DBUS.
Сначала я запускал dbus-monitor, чтобы увидеть, какие события вызывают, когда монитор идет / просыпается от сна:
signal time=1515274499.244468 sender=org.freedesktop.DBus -> destination=:1.394 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
string ":1.394"
signal time=1515274499.244502 sender=org.freedesktop.DBus -> destination=:1.394 serial=4 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameLost
string ":1.394"
signal time=1515274559.337480 sender=:1.6 -> destination=:1.2 serial=29015 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 440
signal time=1515274559.337878 sender=:1.2 -> destination=(null destination) serial=3288 path=/org/gnome/SessionManager/Presence; interface=org.gnome.SessionManager.Presence; member=StatusChanged
uint32 3
signal time=1515274559.338267 sender=:1.2 -> destination=(null destination) serial=3290 path=/org/gnome/SessionManager/Presence; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.SessionManager.Presence"
array [
dict entry(
string "status"
variant uint32 3
)
]
array [
]
signal time=1515274569.389778 sender=:1.6 -> destination=(null destination) serial=29018 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "auto-move-windows@gnome-shell-extensions.gcampax.github.com"
int32 2
string ""
signal time=1515274569.398929 sender=:1.6 -> destination=(null destination) serial=29019 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "clipboard-indicator@tudmotu.com"
int32 2
string ""
signal time=1515274569.399633 sender=org.freedesktop.DBus -> destination=:1.6 serial=5195 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameLost
string "org.kde.StatusNotifierWatcher"
signal time=1515274569.399660 sender=org.freedesktop.DBus -> destination=(null destination) serial=850 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
string "org.kde.StatusNotifierWatcher"
string ":1.6"
string ""
signal time=1515274569.404274 sender=:1.6 -> destination=(null destination) serial=29022 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "ubuntu-appindicators@ubuntu.com"
int32 2
string ""
signal time=1515274569.442137 sender=:1.6 -> destination=(null destination) serial=29025 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "ubuntu-dock@ubuntu.com"
int32 2
string ""
signal time=1515274569.455035 sender=:1.6 -> destination=(null destination) serial=29027 path=/org/gnome/ScreenSaver; interface=org.gnome.ScreenSaver; member=ActiveChanged
boolean true
signal time=1515274569.657300 sender=:1.6 -> destination=:1.42 serial=29037 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 491
signal time=1515274569.657404 sender=:1.6 -> destination=(null destination) serial=29038 path=/org/gnome/Mutter/DisplayConfig; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.Mutter.DisplayConfig"
array [
dict entry(
string "PowerSaveMode"
variant int32 3
)
]
array [
]
signal time=1515276608.243100 sender=:1.6 -> destination=:1.2 serial=29039 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 489
signal time=1515276608.243573 sender=:1.2 -> destination=(null destination) serial=3291 path=/org/gnome/SessionManager/Presence; interface=org.gnome.SessionManager.Presence; member=StatusChanged
uint32 0
signal time=1515276608.243843 sender=:1.2 -> destination=(null destination) serial=3292 path=/org/gnome/SessionManager/Presence; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.SessionManager.Presence"
array [
dict entry(
string "status"
variant uint32 0
)
]
array [
]
signal time=1515276608.244032 sender=:1.6 -> destination=:1.42 serial=29040 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 494
signal time=1515276608.270459 sender=:1.6 -> destination=(null destination) serial=29042 path=/org/gnome/Mutter/DisplayConfig; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.Mutter.DisplayConfig"
array [
dict entry(
string "PowerSaveMode"
variant int32 0
)
]
array [
]
signal time=1515276623.523917 sender=:1.6 -> destination=:1.42 serial=29043 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 491
signal time=1515276623.554451 sender=:1.6 -> destination=(null destination) serial=29047 path=/org/gnome/Mutter/DisplayConfig; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.Mutter.DisplayConfig"
array [
dict entry(
string "PowerSaveMode"
variant int32 3
)
]
array [
]
signal time=1515276668.529836 sender=:1.6 -> destination=:1.2 serial=29048 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 440
signal time=1515276668.530236 sender=:1.2 -> destination=(null destination) serial=3293 path=/org/gnome/SessionManager/Presence; interface=org.gnome.SessionManager.Presence; member=StatusChanged
uint32 3
signal time=1515276668.530565 sender=:1.2 -> destination=(null destination) serial=3295 path=/org/gnome/SessionManager/Presence; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.SessionManager.Presence"
array [
dict entry(
string "status"
variant uint32 3
)
]
array [
]
signal time=1515279067.394398 sender=:1.6 -> destination=:1.2 serial=29051 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 498
signal time=1515279067.394982 sender=:1.2 -> destination=(null destination) serial=3296 path=/org/gnome/SessionManager/Presence; interface=org.gnome.SessionManager.Presence; member=StatusChanged
uint32 0
signal time=1515279067.395139 sender=:1.2 -> destination=(null destination) serial=3297 path=/org/gnome/SessionManager/Presence; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.SessionManager.Presence"
array [
dict entry(
string "status"
variant uint32 0
)
]
array [
]
signal time=1515279067.395662 sender=:1.6 -> destination=:1.42 serial=29052 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 496
signal time=1515279067.414904 sender=:1.6 -> destination=(null destination) serial=29054 path=/org/gnome/Mutter/DisplayConfig; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.Mutter.DisplayConfig"
array [
dict entry(
string "PowerSaveMode"
variant int32 0
)
]
array [
]
signal time=1515279076.828255 sender=:1.6 -> destination=(null destination) serial=29063 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "ubuntu-dock@ubuntu.com"
int32 1
string ""
signal time=1515279076.829775 sender=org.freedesktop.DBus -> destination=(null destination) serial=851 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
string "org.kde.StatusNotifierWatcher"
string ""
string ":1.6"
signal time=1515279076.829812 sender=org.freedesktop.DBus -> destination=:1.6 serial=5215 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
string "org.kde.StatusNotifierWatcher"
signal time=1515279076.829824 sender=:1.6 -> destination=(null destination) serial=29066 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "ubuntu-appindicators@ubuntu.com"
int32 1
string ""
signal time=1515279076.841923 sender=:1.6 -> destination=(null destination) serial=29067 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "clipboard-indicator@tudmotu.com"
int32 1
string ""
signal time=1515279076.844396 sender=:1.6 -> destination=(null destination) serial=29068 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "auto-move-windows@gnome-shell-extensions.gcampax.github.com"
int32 1
string ""
signal time=1515279076.851323 sender=:1.6 -> destination=(null destination) serial=29069 path=/org/gnome/ScreenSaver; interface=org.gnome.ScreenSaver; member=ActiveChanged
boolean false
signal time=1515279076.896958 sender=:1.6 -> destination=(null destination) serial=29218 path=/StatusNotifierWatcher; interface=org.kde.StatusNotifierWatcher; member=StatusNotifierItemRegistered
string "/"
signal time=1515279076.921110 sender=:1.38 -> destination=(null destination) serial=2735 path=/org/gnome/evolution/dataserver/CalendarView/1887/93; interface=org.gnome.evolution.dataserver.CalendarView; member=complete
array [
string ""
string ""
]
signal time=1515279076.924727 sender=:1.34 -> destination=(null destination) serial=2701 path=/org/gnome/evolution/dataserver/CalendarView/1870/92; interface=org.gnome.evolution.dataserver.CalendarView; member=complete
array [
string ""
string ""
]
signal time=1515279077.686970 sender=:1.6 -> destination=(null destination) serial=30014 path=/StatusNotifierWatcher; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.kde.StatusNotifierWatcher"
array [
dict entry(
string "RegisteredStatusNotifierItems"
variant array [
string ":1.66/org/ayatana/NotificationItem/software_update_available"
]
)
]
array [
Я сначала попытался перейти на org.gnome.Mutter.IdleMonitor, но значения uint32 постоянно увеличивались, не зная почему?
Я установил с StatusChanged, вот окончательный скрипт:
#!/bin/bash
# Turn keyboard backlight on/off using https://github.com/MatMoul/g810-led
g413-led -a FFFFFF # always turn on on startup (it turns off for some reason on reboot)
dbus-monitor --session "type=signal,interface=org.gnome.SessionManager.Presence,member=StatusChanged" |
while read x; do
case "$x" in
*"uint32 3"*) g413-led -a 000000;;
*"uint32 0"*) g413-led -a FFFFFF;;
esac
done
Заставки также могут работать:
g413-led -a FFFFFF # always turn on on startup (it turns off for some reason on reboot)
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" |
while read x; do
case "$x" in
*"boolean true"*) g413-led -a 000000;;
*"boolean false"*) g413-led -a FFFFFF;;
esac
done
Конечно, вы можете поместить любую команду. Преимущество первого скрипта по сравнению с этим состоит в том, что он загорается клавиатурой перед входом пользователя, что упрощает ввод пароля.
Единственным недостатком является то, что клавиатура загорается после входа пользователя, а не нажатия клавиши, но я могу жить с этим.
Я экспериментировал с:
dbus-monitor --session "type='signal',interface='org.freedesktop.DBus.Properties',path='/org/gnome/Mutter/DisplayConfig'" | grep 'variant int32' |
while read x; do
case "$x" in
*"variant int32 3"*) g413-led -a 000000;;
*"variant int32 0"*) g413-led -a FFFFFF;;
esac
done
, но по какой-то причине он не работал, возможно, проблема grep.
Решение, с которым я столкнулся, - это события DBUS.
Сначала я запускал dbus-monitor, чтобы увидеть, какие события вызывают, когда монитор идет / просыпается от сна:
signal time=1515274499.244468 sender=org.freedesktop.DBus -> destination=:1.394 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
string ":1.394"
signal time=1515274499.244502 sender=org.freedesktop.DBus -> destination=:1.394 serial=4 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameLost
string ":1.394"
signal time=1515274559.337480 sender=:1.6 -> destination=:1.2 serial=29015 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 440
signal time=1515274559.337878 sender=:1.2 -> destination=(null destination) serial=3288 path=/org/gnome/SessionManager/Presence; interface=org.gnome.SessionManager.Presence; member=StatusChanged
uint32 3
signal time=1515274559.338267 sender=:1.2 -> destination=(null destination) serial=3290 path=/org/gnome/SessionManager/Presence; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.SessionManager.Presence"
array [
dict entry(
string "status"
variant uint32 3
)
]
array [
]
signal time=1515274569.389778 sender=:1.6 -> destination=(null destination) serial=29018 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "auto-move-windows@gnome-shell-extensions.gcampax.github.com"
int32 2
string ""
signal time=1515274569.398929 sender=:1.6 -> destination=(null destination) serial=29019 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "clipboard-indicator@tudmotu.com"
int32 2
string ""
signal time=1515274569.399633 sender=org.freedesktop.DBus -> destination=:1.6 serial=5195 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameLost
string "org.kde.StatusNotifierWatcher"
signal time=1515274569.399660 sender=org.freedesktop.DBus -> destination=(null destination) serial=850 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
string "org.kde.StatusNotifierWatcher"
string ":1.6"
string ""
signal time=1515274569.404274 sender=:1.6 -> destination=(null destination) serial=29022 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "ubuntu-appindicators@ubuntu.com"
int32 2
string ""
signal time=1515274569.442137 sender=:1.6 -> destination=(null destination) serial=29025 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "ubuntu-dock@ubuntu.com"
int32 2
string ""
signal time=1515274569.455035 sender=:1.6 -> destination=(null destination) serial=29027 path=/org/gnome/ScreenSaver; interface=org.gnome.ScreenSaver; member=ActiveChanged
boolean true
signal time=1515274569.657300 sender=:1.6 -> destination=:1.42 serial=29037 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 491
signal time=1515274569.657404 sender=:1.6 -> destination=(null destination) serial=29038 path=/org/gnome/Mutter/DisplayConfig; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.Mutter.DisplayConfig"
array [
dict entry(
string "PowerSaveMode"
variant int32 3
)
]
array [
]
signal time=1515276608.243100 sender=:1.6 -> destination=:1.2 serial=29039 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 489
signal time=1515276608.243573 sender=:1.2 -> destination=(null destination) serial=3291 path=/org/gnome/SessionManager/Presence; interface=org.gnome.SessionManager.Presence; member=StatusChanged
uint32 0
signal time=1515276608.243843 sender=:1.2 -> destination=(null destination) serial=3292 path=/org/gnome/SessionManager/Presence; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.SessionManager.Presence"
array [
dict entry(
string "status"
variant uint32 0
)
]
array [
]
signal time=1515276608.244032 sender=:1.6 -> destination=:1.42 serial=29040 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 494
signal time=1515276608.270459 sender=:1.6 -> destination=(null destination) serial=29042 path=/org/gnome/Mutter/DisplayConfig; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.Mutter.DisplayConfig"
array [
dict entry(
string "PowerSaveMode"
variant int32 0
)
]
array [
]
signal time=1515276623.523917 sender=:1.6 -> destination=:1.42 serial=29043 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 491
signal time=1515276623.554451 sender=:1.6 -> destination=(null destination) serial=29047 path=/org/gnome/Mutter/DisplayConfig; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.Mutter.DisplayConfig"
array [
dict entry(
string "PowerSaveMode"
variant int32 3
)
]
array [
]
signal time=1515276668.529836 sender=:1.6 -> destination=:1.2 serial=29048 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 440
signal time=1515276668.530236 sender=:1.2 -> destination=(null destination) serial=3293 path=/org/gnome/SessionManager/Presence; interface=org.gnome.SessionManager.Presence; member=StatusChanged
uint32 3
signal time=1515276668.530565 sender=:1.2 -> destination=(null destination) serial=3295 path=/org/gnome/SessionManager/Presence; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.SessionManager.Presence"
array [
dict entry(
string "status"
variant uint32 3
)
]
array [
]
signal time=1515279067.394398 sender=:1.6 -> destination=:1.2 serial=29051 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 498
signal time=1515279067.394982 sender=:1.2 -> destination=(null destination) serial=3296 path=/org/gnome/SessionManager/Presence; interface=org.gnome.SessionManager.Presence; member=StatusChanged
uint32 0
signal time=1515279067.395139 sender=:1.2 -> destination=(null destination) serial=3297 path=/org/gnome/SessionManager/Presence; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.SessionManager.Presence"
array [
dict entry(
string "status"
variant uint32 0
)
]
array [
]
signal time=1515279067.395662 sender=:1.6 -> destination=:1.42 serial=29052 path=/org/gnome/Mutter/IdleMonitor/Core; interface=org.gnome.Mutter.IdleMonitor; member=WatchFired
uint32 496
signal time=1515279067.414904 sender=:1.6 -> destination=(null destination) serial=29054 path=/org/gnome/Mutter/DisplayConfig; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.gnome.Mutter.DisplayConfig"
array [
dict entry(
string "PowerSaveMode"
variant int32 0
)
]
array [
]
signal time=1515279076.828255 sender=:1.6 -> destination=(null destination) serial=29063 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "ubuntu-dock@ubuntu.com"
int32 1
string ""
signal time=1515279076.829775 sender=org.freedesktop.DBus -> destination=(null destination) serial=851 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
string "org.kde.StatusNotifierWatcher"
string ""
string ":1.6"
signal time=1515279076.829812 sender=org.freedesktop.DBus -> destination=:1.6 serial=5215 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
string "org.kde.StatusNotifierWatcher"
signal time=1515279076.829824 sender=:1.6 -> destination=(null destination) serial=29066 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "ubuntu-appindicators@ubuntu.com"
int32 1
string ""
signal time=1515279076.841923 sender=:1.6 -> destination=(null destination) serial=29067 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "clipboard-indicator@tudmotu.com"
int32 1
string ""
signal time=1515279076.844396 sender=:1.6 -> destination=(null destination) serial=29068 path=/org/gnome/Shell; interface=org.gnome.Shell.Extensions; member=ExtensionStatusChanged
string "auto-move-windows@gnome-shell-extensions.gcampax.github.com"
int32 1
string ""
signal time=1515279076.851323 sender=:1.6 -> destination=(null destination) serial=29069 path=/org/gnome/ScreenSaver; interface=org.gnome.ScreenSaver; member=ActiveChanged
boolean false
signal time=1515279076.896958 sender=:1.6 -> destination=(null destination) serial=29218 path=/StatusNotifierWatcher; interface=org.kde.StatusNotifierWatcher; member=StatusNotifierItemRegistered
string "/"
signal time=1515279076.921110 sender=:1.38 -> destination=(null destination) serial=2735 path=/org/gnome/evolution/dataserver/CalendarView/1887/93; interface=org.gnome.evolution.dataserver.CalendarView; member=complete
array [
string ""
string ""
]
signal time=1515279076.924727 sender=:1.34 -> destination=(null destination) serial=2701 path=/org/gnome/evolution/dataserver/CalendarView/1870/92; interface=org.gnome.evolution.dataserver.CalendarView; member=complete
array [
string ""
string ""
]
signal time=1515279077.686970 sender=:1.6 -> destination=(null destination) serial=30014 path=/StatusNotifierWatcher; interface=org.freedesktop.DBus.Properties; member=PropertiesChanged
string "org.kde.StatusNotifierWatcher"
array [
dict entry(
string "RegisteredStatusNotifierItems"
variant array [
string ":1.66/org/ayatana/NotificationItem/software_update_available"
]
)
]
array [
Я сначала попытался перейти на org.gnome.Mutter.IdleMonitor, но значения uint32 постоянно увеличивались, не зная почему?
Я установил с StatusChanged, вот окончательный скрипт:
#!/bin/bash
# Turn keyboard backlight on/off using https://github.com/MatMoul/g810-led
g413-led -a FFFFFF # always turn on on startup (it turns off for some reason on reboot)
dbus-monitor --session "type=signal,interface=org.gnome.SessionManager.Presence,member=StatusChanged" |
while read x; do
case "$x" in
*"uint32 3"*) g413-led -a 000000;;
*"uint32 0"*) g413-led -a FFFFFF;;
esac
done
Заставки также могут работать:
g413-led -a FFFFFF # always turn on on startup (it turns off for some reason on reboot)
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" |
while read x; do
case "$x" in
*"boolean true"*) g413-led -a 000000;;
*"boolean false"*) g413-led -a FFFFFF;;
esac
done
Конечно, вы можете поместить любую команду. Преимущество первого скрипта по сравнению с этим состоит в том, что он загорается клавиатурой перед входом пользователя, что упрощает ввод пароля.
Единственным недостатком является то, что клавиатура загорается после входа пользователя, а не нажатия клавиши, но я могу жить с этим.
Я экспериментировал с:
dbus-monitor --session "type='signal',interface='org.freedesktop.DBus.Properties',path='/org/gnome/Mutter/DisplayConfig'" | grep 'variant int32' |
while read x; do
case "$x" in
*"variant int32 3"*) g413-led -a 000000;;
*"variant int32 0"*) g413-led -a FFFFFF;;
esac
done
, но по какой-то причине он не работал, возможно, проблема grep.
Ваша установка кажется довольно сложной для простой проблемы. То, что я сделал бы, это просто запустить крошечный обратный процесс, проверяя время простоя один раз в 2 секунды или около того, предпринять одно действие, если время простоя превышает предел, другое действие, если оно переключается на заданное время простоя.
#!/usr/bin/env python3
import time
import subprocess
# set idle time (seconds)
t = 60
# set commands
on_idle = ["g413", "-led", "-a", "000000"]
on_active = ["g413", "-led", "-a", "FFFFFF"]
def set_state(cmd):
subprocess.Popen(cmd)
def get_idle():
return int(subprocess.check_output("xprintidle").decode("utf-8").strip())/1000
idle1 = 0
while True:
time.sleep(2)
idle2 = get_idle()
# if idle time exceeds (passes) the limit, run one command
if all([idle2 >= t, idle1 < t]):
set_state(on_idle)
# if idle time switches to below (passes) the limit, run another command
elif all([idle2 <= t, idle1 > t]):
set_state(on_active)
idle1 = idle2
sudo apt install xprintidle
Скопируйте сценарий в пустой файл, сохраните его как switch_light.py Установите желаемый холостой ход время для принятия решения после: # set idle time (seconds)
t = 60
Запустить его по команде: python3 /path/to/switch_light.py
Если все работает нормально, добавьте его в Запуск приложений. sudo apt install xprintidle
Убедитесь, что установлен xprintidle
[ f5] Просто убедитесь, что вы разделяете аргументы, как в примере. Скопируйте сценарий в пустой файл, сохраните его как switch_light.pyВаша установка кажется довольно сложной для простой проблемы. То, что я сделал бы, это просто запустить крошечный обратный процесс, проверяя время простоя один раз в 2 секунды или около того, предпринять одно действие, если время простоя превышает предел, другое действие, если оно переключается на заданное время простоя.
#!/usr/bin/env python3
import time
import subprocess
# set idle time (seconds)
t = 60
# set commands
on_idle = ["g413", "-led", "-a", "000000"]
on_active = ["g413", "-led", "-a", "FFFFFF"]
def set_state(cmd):
subprocess.Popen(cmd)
def get_idle():
return int(subprocess.check_output("xprintidle").decode("utf-8").strip())/1000
idle1 = 0
while True:
time.sleep(2)
idle2 = get_idle()
# if idle time exceeds (passes) the limit, run one command
if all([idle2 >= t, idle1 < t]):
set_state(on_idle)
# if idle time switches to below (passes) the limit, run another command
elif all([idle2 <= t, idle1 > t]):
set_state(on_active)
idle1 = idle2
sudo apt install xprintidle
Скопируйте сценарий в пустой файл, сохраните его как switch_light.py Установите желаемый холостой ход время для принятия решения после: # set idle time (seconds)
t = 60
Запустить его по команде: python3 /path/to/switch_light.py
Если все работает нормально, добавьте его в Запуск приложений. sudo apt install xprintidle
Убедитесь, что установлен xprintidle
# set commands
on_idle = ["g413", "-led", "-a", "000000"]
on_active = ["g413", "-led", "-a", "FFFFFF"]
Просто убедитесь, что вы разделяете аргументы, как в примере. Скопируйте сценарий в пустой файл, сохраните его как switch_light.py Ваша установка кажется довольно сложной для простой проблемы. То, что я сделал бы, это просто запустить крошечный обратный процесс, проверяя время простоя один раз в 2 секунды или около того, предпринять одно действие, если время простоя превышает предел, другое действие, если оно переключается на заданное время простоя.
#!/usr/bin/env python3
import time
import subprocess
# set idle time (seconds)
t = 60
# set commands
on_idle = ["g413", "-led", "-a", "000000"]
on_active = ["g413", "-led", "-a", "FFFFFF"]
def set_state(cmd):
subprocess.Popen(cmd)
def get_idle():
return int(subprocess.check_output("xprintidle").decode("utf-8").strip())/1000
idle1 = 0
while True:
time.sleep(2)
idle2 = get_idle()
# if idle time exceeds (passes) the limit, run one command
if all([idle2 >= t, idle1 < t]):
set_state(on_idle)
# if idle time switches to below (passes) the limit, run another command
elif all([idle2 <= t, idle1 > t]):
set_state(on_active)
idle1 = idle2
sudo apt install xprintidle
Скопируйте сценарий в пустой файл, сохраните его как switch_light.py Установите желаемый холостой ход время для принятия решения после: # set idle time (seconds)
t = 60
Запустить его по команде: python3 /path/to/switch_light.py
Если все работает нормально, добавьте его в Запуск приложений. sudo apt install xprintidle
Убедитесь, что установлен xprintidle
# set commands
on_idle = ["g413", "-led", "-a", "000000"]
on_active = ["g413", "-led", "-a", "FFFFFF"]
Просто убедитесь, что вы разделяете аргументы, как в примере. Скопируйте сценарий в пустой файл, сохраните его как switch_light.py