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

时间:2019-01-21 14:29:22

标签: bash fedora

我目前正在尝试对Sylpheed进行过滤,以从命令中删除服务器中的消息,并且我正在考虑编写一个bash脚本,当您按下诸如F8之类的命令时,该脚本将返回true,然后将其用作论点。

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

#!/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键相同。

我已经尝试过通过删除^并将读取的-n5更改为读取的-n4来进行变体,但是grep仍然会说“ grep:不匹配”等。有人可以帮忙吗?

也向任何可以向我展示如何在Slypheed上创建过滤器以从服务器删除电子邮件的人开放,作为替代解决方案(显然可以,但是我无法使其正常工作;目前正在对其进行测试)在gmail帐户上,并且在客户端中删除的所有邮件都不会在gmail上删除,而且我似乎无法使过滤器在标记邮件,彩色邮件或上述任何允许用户选择他们要从服务器删除的邮件)。由于客户端规范,我无法切换到IMAP。

2 个答案:

答案 0 :(得分:0)

在网络上找到此脚本:

#!/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"

答案 1 :(得分:0)

我也遇到过这个问题。问题之一是不同的不可打印键有不同数量的字符,所以经过一些实验我写了以下脚本:

# 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 来检查:

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