首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让bash脚本在功能键按下时返回true (用作Sylpheed过滤器)

如何让bash脚本在功能键按下时返回true (用作Sylpheed过滤器)
EN

Stack Overflow用户
提问于 2019-01-21 22:29:22
回答 2查看 203关注 0票数 1

我目前正在尝试在Sylpheed上创建一个过滤规则,它可以根据命令从服务器上删除一条消息,我正在考虑编写一个bash脚本,当你按下像F8这样的东西时返回true,然后将其用作参数。

不幸的是,这似乎比预期的要难。到目前为止,我已经尝试过以下代码:

代码语言:javascript
复制
#!/bin/sh
f8='^[[19~'
f9='^[[20~'
echo please enter the F8 function key
read -n5 key                      # Read 5 characters.
echo -n "$key" | grep "$f8"  #Check if character code detected.
if [ "$?" -eq $SUCCESS ]
then
  echo "F8 key pressed."
  return 0
fi
echo -n "$key" | grep "$f9"  #Check if character code detected.
if [ "$?" -eq $SUCCESS ]
then
  echo "F9 key pressed."
  return 0
fi

这是我在网上找到的,并做了一些修改,但不幸的是,它似乎不起作用(使用Fedora LXDE)。我通过在终端中使用control v,然后按F8和F9,获得了F8和F9键的按键数据。

我尝试过它的变体,通过删除^并将read -n5改为read -n4,但grep仍然不断地说"grep: Unmatched“等等。有人能帮助我吗?

也开放给任何人谁可以告诉我如何在Slypheed上创建过滤器从服务器上删除电子邮件作为替代解决方案(显然这是可能的,但我还没能让它工作;目前正在gmail帐户上测试它,在客户端删除的任何消息都不会在gmail上删除,我似乎不能让过滤器在标记消息或彩色消息上运行,或上面的任何变体,让用户选择他们想要从服务器上删除的消息)。由于客户端规范,我无法切换到IMAP。

EN

回答 2

Stack Overflow用户

发布于 2019-01-22 23:10:21

在web上找到了以下脚本:

代码语言:javascript
复制
#!/bin/bash

_key()
{
  local kp
  ESC=$'\e'
  _KEY=
  read -d '' -sn1 _KEY
  case $_KEY in
    "$ESC")
        while read -d '' -sn1 -t1 kp
        do
          _KEY=$_KEY$kp
          case $kp in
            [a-zA-NP-Z~]) break;;
          esac
        done
    ;;
  esac
  printf -v "${1:-_KEY}" "%s" "$_KEY"
}

_key x


case $x in
  $'\e[11~' | $'\e[OP') key=F1 ;;
  $'\e[12~' | $'\e[OQ') key=F2 ;;
  $'\e[13~' | $'\e[OR') key=F3 ;;
  $'\e[14~' | $'\e[OS') key=F4 ;;
  $'\e[15~') key=F5 ;;
  $'\e[16~') key=F6 ;;
  $'\e[17~') key=F7 ;;
  $'\e[18~') key=F8 ;;
  $'\e[19~') key=F9 ;;
  $'\e[20~') key=F10 ;;
  $'\e[21~') key=F11 ;;
  $'\e[22~') key=F12 ;;
  $'\e[A' ) key=UP ;;
  $'\e[B' ) key=DOWN ;;
  $'\e[C' ) key=RIGHT ;;
  $'\e[D' ) key=LEFT ;;
  ?) key=$x ;;
  *) key=??? ;;
esac

echo "You have pressed $key"
票数 0
EN

Stack Overflow用户

发布于 2021-03-06 06:18:31

我也面临着这个问题。其中一个问题是,不同的不可打印密钥具有不同的字符数,因此在经过一些实验后,我编写了以下脚本:

代码语言:javascript
复制
# Special keypress could take variable amount of characters
keypress=""
# waiting for any key press down
read -rsN1 keytap
# loop while read can read any additional character and join all of them
while [ -n "$keytap" ]; do
 keypress="${keypress}${keytap}"
 read -sN1 -t 0.01 keytap
done

现在您可以使用case来检查:

代码语言:javascript
复制
case "$keypress" in
  $'\e[11~') echo F1
  $'\e[21~') echo F10
  $'\e[A') echo Up arrow
  $'\t') echo Tab key
  $'\e[3~') echo Del key
esac
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54292077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档