我在 Ubuntu 14.04 上通过 SSH 使用 Putty 使用 zsh,并且正在为键盘设置键绑定。因为 zsh 似乎没有使用我的功能键,所以我想我应该设置脚本来执行类似于按键上的图片所代表的操作。我正在研究电子邮件按钮,它运行得很好,但我希望它能更好。这就是我所拥有的~/.zshrc
:
# Ensure we are in emacs mode
bindkey -e
# This requires you to enable the ATOM feed in Gmail. If you don't know what that is then
# go ahead and try this and let it fail. There will then be a message in your inbox you
# can read with instruction on how to enable it. Username below should be replaced with
# your email id (the portion of your email before the @ sign).
_check-gmail() {
echo
curl -u username:password --silent "https://mail.google.com/mail/feed/atom" | tr -d '\n' | awk -F '<entry>' '{for (i=2; i<=NF; i++) {print $i}}' | sed -n "s/<title>\(.*\)<\/title.*name>\(.*\)<\/name>.*/\2 - \1/p"
echo
exit
}
zle -N _check-gmail
# F2 - Display Unread Email
bindkey "^[[12~" _check-gmail
当像上面那样使用时它就起作用了。我有两个问题。
首先也是最重要的,我宁愿让它询问我密码,而不是像这样将其留在脚本中。通过:password
从命令行中删除curl命令可以轻松完成此操作,但在此文件中使用时会导致问题。具体来说,它似乎接受第一个按键,但其余的按键则退出到另一个 shell,该 shell 不是密码输入。
其次,我第一次在 shell 中运行它时它运行得很好。之后它不会正确返回提示。我需要按Enter才能得到另一个提示。有办法解决这个问题吗?
.zshrc
我已将文件的完整键绑定部分放在GitHub。
答案1
问题是它curl
需要一些正常的终端设置,并且zle
不希望您更改终端设置。所以你可以这样写:
_check-gmail() {
zle -I
(
s=$(stty -g) # safe zle's terminal setting
stty sane # sane settings for curl
curl -u username --silent "https://mail.google.com/mail/feed/atom" |
tr -d '\n' | awk -F '<entry>' '{for (i=2; i<=NF; i++) {print $i}}' |
sed -n "s/<title>\(.*\)<\/title.*name>\(.*\)<\/name>.*/\2 - \1/p"
stty $s # restore zle's terminal settings
) < /dev/tty
}
答案2
一种方法是在运行函数之前提示用户,_check-gmail
以便脚本在变量中掌握密码。然后,您将密码变量传递到函数中,以便命令curl
可以使用它。
例如:
$ tst_fun () { echo "Parameter #1 is $1"; }
$ tst_fun "my_pass"
Parameter #1 is my_pass
$
要从脚本的用户那里获取密码,您有多种选择。如果您想要一个漂亮的 GUI,您可以zenity
弹出一个对话框,要求输入密码。
例如:
my_pass=$(zenity --password)
echo "$my_pass"
现在,当运行上述命令时,输入到对话框中的结果可在变量中使用$my_pass
。因此,如果我在对话框中输入密码“supersecret”,我会得到以下信息:
$ my_pass=$(zenity --password)
$ echo $my_pass
supersecret