将一个键绑定到读取标准输入的命令

时间:2016-04-24 20:15:27

标签: bash

我有一个脚本从stdin读取一行并根据该行的内容执行一些操作。我需要将一个键绑定到该脚本,这样只需键入Ctrl-t就可以调用它。当我按名称调用脚本时,它按预期工作,但是当我按下键绑定时它会挂起。实际上shell挂了,我必须杀了它。该脚本使用read -r line。我尝试使用cat得到相同的结果。

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

#!/bin/bash

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

这样绑定:

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

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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