在 bash 中,非常有用的 shell-expand-line ( M-C-e
) 会在当前行将命令替换扩展为其内容。但是,对于没有 shebang 的命令,这工作得非常奇怪。
可以通过以下内容验证这一点。
- 创建一个带有和不带有 shebang 的简单可执行文件。
echo echo hi >> test-no-shebang
chmod +x test-no-shebang
echo '#!/bin/sh' >> test-shebang
echo echo hi >> test-shebang
chmod +x test-shebang
- 输入
`./test-shebang`
,然后M-C-e
。这将按预期工作,将行扩展为hi
。C-_
正常工作,撤消扩展。 - 输入
`./test-no-shebang`
,然后M-C-e
。这工作得很奇怪,确实将行扩展为hi
,但删除了行前的提示。C-_
不起作用,而是逐字打印字符,大多数绑定也是如此,但C-u
有点工作,成功清除了行(但没有清除hi
)。
为什么会这样?我可以让 shell-expand-line 在没有 shebang 的情况下为脚本工作吗?
编辑:
一些评论认为我最好提及所提到的键绑定是指 emacs 行编辑绑定(这是默认的 bash 键绑定)。
经过更多测试,我发现我可以在 mac 终端和 bash 版本的 kitty 上重现该问题
5.2.15(1)-release
,但无法在 bash 上重现该问题3.2.57(1)-release
。
感谢@Vilinkameni 建议查阅邮件列表;GNU 的专家迅速诊断出此问题为已知错误,已在 devel 分支中修复。据推测,此问题将在 5.2 以上版本中修复。