Вопрос звучит немного противоречиво, поскольку вы цитируете инструменты X, но просите решение, которое «в идеале должно работать без X».
О вашем 4 -м обнаружении:
xinput
предоставит вам соответствие
$ xinput list-props 11
Device 'AT Translated Set 2 keyboard':
Device Enabled (145): 1
Coordinate Transformation Matrix (147): 1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000
Device Product ID (266): 1, 1
Device Node (267): "/dev/input/event0"
по крайней мере со следующей версией
$ xinput --version
xinput version 1.6.1
XI version on server: 2.3
#include
//#include
#include
#include
// typical use : sudo ./a.out /dev/input/event*
int main (int argc, char *argv[])
{
struct input_event ev[64];
int fd[argc],rd,idev,value, size = sizeof (struct input_event);
char name[256] = "Unknown";
if(argc==1) return -1;
int ndev=1;
while(ndev= size){
value = ev[0].value;
if (value != ' ' && ev[1].value == 1 && ev[1].type == 1){
ioctl (fd[idev], EVIOCGNAME (sizeof (name)), name);
printf ("%s\n", name);
return idev;
}
}
}
// sleep(1);
}
return -1;
}
Большое спасибо этой странице . Я удалил большинство проверок безопасности из кода, который я заимствовал там, для ясности, в реальном коде они, вероятно, вам нужны.
Обратите внимание, что нажатия клавиш отражаются эхом, поэтому вы действительно можете попросить пользователя нажать клавишу-модификатор (Shift, Control ...), а не любую клавишу .
Скомпилируйте указанный выше исходный код C и используйте его следующим образом:
xinput list --id-only "keyboard: $ (sudo ./a. out / dev / input / event *) "
Предполагая, что getdatabase1
и getdatabase2
являются командами, которые печатают свои подсчеты в stdout, вы сможете изменить свои назначения на
var1=$(getdatabase1)
var2=$(getdatabase2)
var3=$((var1+var2))
printf "%s\n%s\n%s\n" "$var1" "$var2" "$var3" > file.txt
$(...)Синтаксис
запускает команду между паренсами и «возвращает» stdout
этой команды, которую мы здесь сохраняем в наших переменных. Без них имя команды будет рассматриваться как сама строка и присваиваться переменным, но она не будет выполнена.
вы пытались запустить их в подоболочке следующим образом:
(getdatabase1; getdatabase2) > file.txt
если это не работает, пожалуйста, уточните, какой результат вы получаете или его отсутствие.