我有一个脚本从stdin读取一行,并根据行的内容执行一些操作.我需要将一个键绑定到该脚本,这样只需键入Ctrl-t就可以调用它.当我按名称调用脚本时,它按预期工作,但是当我按下键绑定时,它会挂起.实际上shell挂了,我必须杀了它.该脚本使用read -r line.我试着cat用同样的结果.
脚本看起来像这样(文件名read.sh):
#!/bin/bash
echo -n ' > '
read -r buf
echo "you typed $buf"
Run Code Online (Sandbox Code Playgroud)
像这样绑定:
bind -x '"\C-t" : "read.sh"'
Run Code Online (Sandbox Code Playgroud)
按Ctrl+时的终端设置t与仅通过终端启动脚本时的终端设置不同。如果将以下行添加到read.sh,它将打印您的终端设置:
echo Terminal settings: "$(stty -a)"
Run Code Online (Sandbox Code Playgroud)
现在单独运行脚本,然后按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"
Run Code Online (Sandbox Code Playgroud)