我有一个脚本从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"'
答案 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"