Bash 将密钥绑定到读取stdin的命令

Bash 将密钥绑定到读取stdin的命令,bash,Bash,我有一个脚本,可以从stdin中读取一行,并根据该行的内容执行一些操作。我需要将一个键绑定到该脚本,以便只需键入Ctrl-t即可调用它。当我按脚本名调用脚本时,它会按预期工作,但当我按下键绑定时,它会挂起。事实上,贝壳挂着,我必须杀死它。脚本使用read-r行。我尝试了cat,结果相同 脚本如下所示(文件名read.sh): 像这样绑定: bind -x '"\C-t" : "read.sh"' 当您按下Ctrl+t时,终端设置与仅通过终端启动脚本时不同。如果将以下行添加到read.sh,它将

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

脚本如下所示(文件名read.sh):

像这样绑定:

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

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

echo Terminal settings: "$(stty -a)"
现在自己运行脚本,然后按Ctrl+t运行它。您会注意到一些差异,其中最大的是添加了
-echo
-icrnl
,它们关闭echo并更改换行符处理。这将显示脚本挂起的外观

您可以通过强制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"

你能把你试过的东西贴出来吗?回答得很好。谢谢
#!/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"