加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

bash – 将一个键绑定到读取stdin的命令

发布时间:2020-12-15 22:39:13 所属栏目:安全 来源:网络整理
导读:我有一个脚本从stdin读取一行,并根据行的内容执行一些操作.我需要将一个键绑定到该脚本,这样只需键入Ctrl-t就可以调用它.当我按名称调用脚本时,它按预期工作,但是当我按下键绑定时,它会挂起.实际上 shell挂了,我必须杀了它.该脚本使用read -r行.我尝试用同样
我有一个脚本从stdin读取一行,并根据行的内容执行一些操作.我需要将一个键绑定到该脚本,这样只需键入Ctrl-t就可以调用它.当我按名称调用脚本时,它按预期工作,但是当我按下键绑定时,它会挂起.实际上 shell挂了,我必须杀了它.该脚本使用read -r行.我尝试用同样结果的猫.

脚本看起来像这样(文件名read.sh):

#!/bin/bash

echo -n '  > '
read -r buf
echo "you typed $buf"

像这样绑定:

bind -x '"C-t" : "read.sh"'

解决方法

按Ctrl t时的终端设置与刚刚通过终端启动脚本时的终端设置不同.如果您将以下行添加到read.sh,它将打印您的终端设置:

echo Terminal settings: "$(stty -a)"

现在单独运行脚本,然后按Ctrl t运行它.您会注意到一些差异,其中最大的差异是-echo和-icrnl的添加,它们会关闭回声并改变换行处理.这使脚本的外观悬挂.

您可以通过强制tty回到规范模式并重新添加echo来解决脚本中的这个问题.在进行任何stty更改之前,您需要保存设置并在脚本退出时还原它们.你可以使用陷阱.

#!/bin/bash
# Save the tty settings and restore them on exit.
SAVED_TERM_SETTINGS="$(stty -g)"
trap "stty "${SAVED_TERM_SETTINGS}"" EXIT

# Force the tty (back) into canonical line-reading mode.
stty cooked echo

# Read lines and do stuff.
echo -n '  > '
read -r buf
echo "you typed $buf"

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读