使用 rlwrap 包裹破折号的正确方法

使用 rlwrap 包裹破折号的正确方法

在 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!?

当我按下 时Ctrlzdash被停止而不是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维护者)

相关内容