在 Ubuntu 上,我已设置alias sh='rlwrap --complete-filenames sh'
在使用 dash shell 时获取 readline 键绑定和文件名补全(在我的计算机上,sh 是 /usr/bin/sh,它是 /usr/bin/dash 的符号链接)。但是,rlwrap 似乎没有正确处理 SIGTSTP。考虑以下 shell 会话:
在bash中:
[email protected]:~$ alias sh='rlwrap --complete-filenames sh'
[email protected]:~$ sh # Run dash.
在破折号中:
$ sleep 100 # Right after this, I press Ctrl-Z to send SIGTSTP.
[1]+ Stopped rlwrap --complete-filenames sh
[email protected]:~$ # What!? Why do I get a bash prompt!?
当我按下 时Ctrlz,dash
被停止而不是sleep
。如何使 SIGTSTP 停止在 dash 中运行的前台进程,而不是停止 dash 本身?将 rlwrap 与 dash 一起使用的正确方法是什么?
我知道作为 rlwrap 的替代方案,我可以使用 libedit ( ./configure --with-libedit
) 编译 dash 以获得 readline 功能(使用dash -E
),但不幸的是,这似乎不支持文件名完成。
答案1
如何使 SIGTSTP 停止在 dash 中运行的前台进程,而不是停止 dash 本身?
这不是你想要的。rlwrap
无法知道作业表中的内容dash
并相应地将其麻醉飞镖定向到子进程之一dash
。
然而,解决方案可以更简单:只需将CTRL+Z
按键转发到dash
(通过将其绑定到rlwrap-direct-keypress
您的.inputrc
)。
和当前的 rlwrap
这不起作用但是:rlwrap
镜像所有dash
终端设置(包括VSUSP
挂起字符),因此rlwrap
永远不会看到按键。
这是我的待办事项列表(请参阅https://github.com/hanslub42/rlwrap/issues/111)
汉斯(rlwrap
维护者)