getevent -t -c 1 /dev/input/event0 | grep -oP ".*?((?<=KEYCODE_)[A-Z0-9]+).*" | awk '{print $10}' grep: Unknown option 'P' (see "grep --help")
时间: 2024-02-11 11:04:10 浏览: 138
这是一个Linux命令,用于获取输入设备(比如触摸屏)的事件并解析出按键码。但是,命令中的正则表达式有误,导致grep命令无法正确识别选项。正确的命令应该是:
```
getevent -t -c 1 /dev/input/event0 | grep -oE ".*?((?<=KEYCODE_)[A-Z0-9]+).*" | awk '{print $10}'
```
其中,-oE选项表示使用正则表达式进行匹配,并输出匹配到的内容;正则表达式中使用了零宽度正回顾后发断言,以匹配出按键码。awk命令则是为了输出匹配到的按键码。
相关问题
#!/vendor/bin/sh # 获取当前正在使用的屏幕 ID current_id=$(dumpsys display | grep "mDisplayId=" | grep -oP "(?<=mDisplayId=)[0-9]+") # 将主屏幕设置为默认屏幕 settings put global display_portrait 0 # 启动 ConsumerIRService 服务,以便接收遥控器的输入事件 setprop ro.remotecontroller.modules consumerir start consumer_ir_service # 循环监听遥控器的输入事件 while true; do # 读取遥控器的输入事件,并解析出按键码 ir_code=$(getevent -t -c 1 /dev/input/event0 | grep -oP ".*?((?<=KEYCODE_)[A-Z0-9]+).*" | awk '{print $10}') # 如果按键码是 KEYCODE_TV,则切换主屏幕或副屏幕的使用状态 if [ "$ir_code" = "KEYCODE_TV" ]; then if [ "$current_id" = "0" ]; then settings put global display_portrait 1 current_id=1 else settings put global display_portrait 0 current_id=0 fi fi # 降低 CPU 占用率,避免过度消耗系统资源 sleep 0.1 done
根据您提供的脚本,我可以给出以下优化建议:
1. 使用变量存储一些常量,避免在代码中多次使用字符串常量。例如:
```
# 存储常量
EVENT_DEVICE="/dev/input/event0"
KEYCODE_TV="KEYCODE_TV"
# 获取当前正在使用的屏幕 ID
current_id=$(dumpsys display | grep "mDisplayId=" | grep -oP "(?<=mDisplayId=)[0-9]+")
# 将主屏幕设置为默认屏幕
settings put global display_portrait 0
# 启动 ConsumerIRService 服务,以便接收遥控器的输入事件
setprop ro.remotecontroller.modules consumerir
start consumer_ir_service
# 循环监听遥控器的输入事件
while true; do
# 读取遥控器的输入事件,并解析出按键码
ir_code=$(getevent -t -c 1 $EVENT_DEVICE | grep -oP ".*?((?<=KEYCODE_)[A-Z0-9]+).*" | awk '{print $10}')
# 如果按键码是 KEYCODE_TV,则切换主屏幕或副屏幕的使用状态
if [ "$ir_code" = "$KEYCODE_TV" ]; then
if [ "$current_id" = "0" ]; then
settings put global display_portrait 1
current_id=1
else
settings put global display_portrait 0
current_id=0
fi
fi
# 降低 CPU 占用率,避免过度消耗系统资源
sleep 0.1
done
```
2. 在代码中添加注释,提高代码可读性和可维护性。
3. 可以根据具体需求调整循环监听遥控器输入事件的时间间隔,如调整为 sleep 0.5,可以减少 CPU 占用率。
4. 可以使用函数封装一些重复的代码块,如获取当前屏幕 ID 的代码块。这样可以提高代码复用性和可维护性。
#!/system/bin/sh # Set main screen as default setprop sys.display.use_main_screen true # Start ConsumerIRService and enable IR remote control setprop ro.remotecontroller.modules consumerir start consumer_ir_service while true do # Read IR codes from remote controller ir_code=$(getevent -t -c 1 /dev/input/event0 | grep -oP ".*?((?<=KEYCODE_)[A-Z0-9]+).*" | awk '{print $10}') # If the IR code is "KEYCODE_SWITCH_SCREEN", toggle main and secondary screen if [ "$ir_code" = "KEYCODE_SWITCH_SCREEN" ]; then if [ "$(getprop sys.display.use_main_screen)" = "true" ]; then setprop sys.display.use_main_screen false else setprop sys.display.use_main_screen true fi fi done
这是一个可以实现使用遥控器切换主副屏幕的 shell 脚本,其中使用了 `getevent` 命令来获取遥控器的输入事件,然后根据获取到的输入事件切换主副屏幕。
在这个脚本中,我们首先使用 `setprop` 命令将主屏幕设置为默认显示屏幕,并启动 ConsumerIRService 服务,以便接收遥控器的输入事件。然后,我们使用 `while true` 循环来监听遥控器的输入事件,并根据输入事件切换主副屏幕。具体来说,我们使用 `getevent` 命令从 `/dev/input/event0` 设备读取输入事件,并使用 `grep` 和 `awk` 命令解析出遥控器按下的按键码。如果按键码是 `KEYCODE_SWITCH_SCREEN`,则使用 `setprop` 命令切换主副屏幕的显示状态。
需要注意的是,这个脚本文件需要具备可执行权限,你可以使用以下命令来赋予它可执行权限:
```bash
chmod +x /system/bin/switch_screen.sh
```
另外,为了让这个脚本在系统启动后自动运行,你需要将它添加到系统的开机自启动列表中。具体的实现方法可以参考我之前给你的回答中的方法。
阅读全文