Все ли параметры оболочки не наследуются сценариями?

Я отвечу на вопрос в обратном порядке:

  1. Почему их так много?

Это устройства, которые соответствуют большинству входов, имеющихся на машине (есть и другие, например, микрофон не будет управляется в / dev / input ). Вопреки предположению, что одна клавиатура плюс одна мышь дает 2 устройства, даже самая простая клавиатура и самая простая мышь все равно дают 6 из них.

Почему 6? Поскольку Xorg создаст тестовую клавиатуру ввода и мышь тестового ввода (обе виртуальные) во время своего запуска. Кроме того, он объединит тестовую клавиатуру с реальной клавиатурой в основное виртуальное устройство. т.е. он будет выполнять мультиплексирование ввода. То же самое произойдет с тестовой и реальной мышью.

Кроме того, на обычном компьютере (настольном или портативном) помимо клавиатуры есть и другие кнопки: кнопка питания, кнопка сна.

Устройства eventN там - это устройства для вещей, которые создает Xorg, и для того, что есть у компьютера. N поступает из последовательных идентификаторов и аналогичен идентификаторам в xinput . Например, на моей машине:

[~]# ls -l /dev/input/
total 0
drwxr-xr-x 2 root root     100 Jan 26 16:01 by-id
drwxr-xr-x 2 root root     140 Jan 26 16:01 by-path
crw-rw---- 1 root input 13, 64 Jan 26 16:01 event0
crw-rw---- 1 root input 13, 65 Jan 26 16:01 event1
crw-rw---- 1 root input 13, 74 Jan 26 16:01 event10
crw-rw---- 1 root input 13, 75 Jan 26 16:01 event11
crw-rw---- 1 root input 13, 76 Jan 26 16:01 event12
crw-rw---- 1 root input 13, 77 Jan 26 16:01 event13
crw-rw---- 1 root input 13, 66 Jan 26 16:01 event2
crw-rw---- 1 root input 13, 67 Jan 26 16:01 event3
crw-rw---- 1 root input 13, 68 Jan 26 16:01 event4
crw-rw---- 1 root input 13, 69 Jan 26 16:01 event5
crw-rw---- 1 root input 13, 70 Jan 26 16:01 event6
crw-rw---- 1 root input 13, 71 Jan 26 16:01 event7
crw-rw---- 1 root input 13, 72 Jan 26 16:01 event8
crw-rw---- 1 root input 13, 73 Jan 26 16:01 event9
crw-rw---- 1 root input 13, 63 Jan 26 16:01 mice
crw-rw---- 1 root input 13, 32 Jan 26 16:01 mouse0
crw-rw---- 1 root input 13, 33 Jan 26 16:01 mouse1

И xinput дает мне аналогичные идентификаторы:

[~]$ xinput list
⎡ Virtual core pointer                      id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ Logitech USB Optical Mouse                id=10   [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=14   [slave  pointer  (2)]
⎣ Virtual core keyboard                     id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
    ↳ Power Button                              id=6    [slave  keyboard (3)]
    ↳ Video Bus                                 id=7    [slave  keyboard (3)]
    ↳ Power Button                              id=8    [slave  keyboard (3)]
    ↳ Sleep Button                              id=9    [slave  keyboard (3)]
    ↳ USB 2.0 Camera                            id=11   [slave  keyboard (3)]
    ↳ Asus Laptop extra buttons                 id=12   [slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard              id=13   [slave  keyboard (3)]

(Посмотрите, что eventN соответствует id = N )

Без Xorg

1.1 Какова цель этого файла?

Обратите внимание, что все случайные входы (включая мою USB-камеру!) Воспринимаются Xorg как часть виртуальной клавиатуры. Это позволяет мультиплексировать и демультиплексировать вход. Например, я могу перемещать мышь через USB-мышь или через трекпад, и приложению не нужно знать разницу.

(USB-камера является частью виртуальной клавиатуры, потому что у нее есть кнопка для ее включения и выключения. А поскольку это кнопка, она становится частью подсистемы клавиатуры. Фактический видеовход обрабатывается в / sys / class / video4linux .)

Другими словами, для приложения действительно есть только одна клавиатура и только одна мышь. Но и Xorg, и ядро ​​должны знать различия. И это приводит к последней части:

1.2 Почему бы просто не отправить его прямо из ядра на X-сервер?

Потому что Xorg должен знать разницу.

И есть ситуации, в которых это полезно. Вы можете переназначить ключи в Xorg на каждое подчиненное устройство ввода по-разному. Например, у меня есть игровой набор с педалями, при использовании в гоночной игре он выводит a , b и c для каждой из своих педалей. Тем не менее, при программировании я переназначаю эти клавиши на Esc , Ctrl и Alt , без переназначения клавиш на самой клавиатуре.

Кроме того, не обязательно, чтобы машина запускала Xorg. Например, на безголовом сервере я могу получить следующий вывод:

[~]$ ls -l /dev/input/
total 0
drwxr-xr-x 2 root root      80 Nov  8 02:36 by-path
crw-rw---- 1 root input 13, 64 Nov  8 02:36 event0
crw-rw---- 1 root input 13, 65 Nov  8 02:36 event1
crw-rw---- 1 root input 13, 66 Nov  8 02:36 event2

Где устройства ввода соответствуют последовательным портам (особенно в этом случае они соответствуют) вместо клавиатуры или мыши.

1
19.08.2017, 22:42
2 ответа

В случае bashэто зависит от того, находится ли $SHELLOPTSв среде или нет.

bash-4.4$ export SHELLOPTS
bash-4.4$ set -x
bash-4.4$ bash -c 'echo x'
+ bash -c 'echo x'
+ echo x
x

Посмотрите, как bash -c 'echo x'унаследовал опцию xtrace. Для опций, установленных с помощью shopt, это то же самое, но с переменной $BASHOPTS.

Это особенно удобно для опции xtraceдля отладки, когда вы хотите запустить bashскрипт (или любую команду, выполняющую bashскрипт )и все другие bashскрипты, которые он может вызвать., рекурсивно сxtrace(при условии, что ничего не делает set +xв этих скриптах ). Если ваш sh— это bash, это также повлияет на них, как и на system("command line"), сделанные на других языках :

.
env SHELLOPTS=xtrace some-command
5
27.01.2020, 23:18

Вы можете вызывать скрипты (или оболочка с командной строкой) явно с параметрами:

shopt -s expand_aliases
alias shell_call='bash -$-'
shell_call /path/to/script

Изменения в скрипте будут автоматически передаваться дочерним оболочкам. Однако этот подход включает только функции.

4
27.01.2020, 23:18

Теги

Похожие вопросы