Выполните команду на основе содержимого непрерывного потока вывода - PullRequest
1 голос
/ 19 октября 2019

Эта команда здесь:

stdbuf -oL -eL libinput debug-events \
  --device /dev/input/by-path/pci-0000:00:1f.0-platform-INT33D6:00-event \
  | grep SWITCH_TOGGLE

Возвращает в непрерывном потоке, прослушивая изменения на устройстве, такие строки:

event7   SWITCH_TOGGLE     +2.65s   switch tablet-mode state 1
event7   SWITCH_TOGGLE     +4.62s   switch tablet-mode state 0

Дело в том, когда состояние меняется на1 Я хочу, чтобы была введена эта команда:

systemctl start iio-sensor-proxy.service

Когда состояние равно 0, я хочу, чтобы эта команда была выполнена:

systemctl stop iio-sensor-proxy.service

Как собрать все вместе?

Эндрю Виккерс, я даже пытался сделать это, чтобы узнать, было ли что-нибудь возвращено, но ничего:

#!/bin/bash

stdbuf -oL -eL libinput debug-events --device /dev/input/by-path/pci-0000:00:1f.0-platform-INT33D6:00-event | grep SWITCH_TOGGLE |
while read string; do
  echo "$string";
done

Ничего не повторялось ..

Ответы [ 2 ]

2 голосов
/ 20 октября 2019

Как работать с вводом потока в bash: некоторые рекомендации.

  • используйте sed вместо grep: легче и быстрее:

  • используйте выделенную FD для команды освобождения STDIN .

Мой образец:

DEVICE=/dev/input/by-path/pci-0000:00:1f.0-platform-INT33D6:00-event

exec 6< <(
      exec stdbuf -oL -eL libinput debug-events --device $DEVICE |
          sed -une /SWITCH_TOGGLE/p
)

while read -u 6 foo foo mtime action target foo state; do
  if [ "$action" = "switch" ] && [ "$target" = "tablet-mode" ] ;then
    case $state in
        0 ) systemctl stop  iio-sensor-proxy.service ;;
        1 ) systemctl start iio-sensor-proxy.service ;;
    esac
  fi
done

Оттуда вы можете использовать read на STDIN для некоторой интерактивности :

DEVICE=/dev/input/by-path/pci-0000:00:1f.0-platform-INT33D6:00-event

exec 6< <(
      exec stdbuf -oL -eL libinput debug-events --device $DEVICE |
          sed -une /SWITCH_TOGGLE/p
)
LIPIDS=($(ps ho pid,ppid | sed "s/ $!$//p;d"))

while :;do
  read -t 1 -u 6 foo foo mtime action target foo state &&
  if [ "$action" = "switch" ] && [ "$target" = "tablet-mode" ] ;then
    case $state in
        0 ) systemctl stop  iio-sensor-proxy.service ;;
        1 ) systemctl start iio-sensor-proxy.service ;;
    esac
  fi
  if read -t .001 -n 1 USERINPUT ;then
      case $USERINPUT in
          q ) exec 6<&- ; echo User quit.; kill ${LIPIDS[@]} ; break ;;
      esac
  fi
done
0 голосов
/ 19 октября 2019

Это должно сделать это:

#!/bin/bash

stdbuf -oL -eL libinput debug-events \
    --device /dev/input/by-path/pci-0000:00:1f.0-platform-INT33D6:00-event |
  grep SWITCH_TOGGLE |
while read -a fields; do
  case ${fields[6]} in
    0) systemctl stop iio-sensor-proxy.service;;
    1) systemctl start iio-sensor-proxy.service;;
  esac
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...