我将描述第一个环境:
Windows 电脑,在 powershell 中运行
make
。 Make 使用 bash 作为它的 shell。我也使用 Windows 终端。所以powershell正在Windows终端中运行,调用make target。
问题:
当我运行任何目标(至少有一些 shell 调用)并按例如。向上箭头,在 make call 结束时,我在 powershell 中打印了
[A
。
我的目标是在 powershell 中获得向上箭头操作来加载上一个命令。这样,我可以快速输入
make clean
,然后按向上箭头,从 powershell make build
获取历史命令。这以前是有效的,但我不知道到底发生了什么变化。似乎 make 调用 bash 和 bash 将我的向上箭头解释为转义序列,该序列被发送到 powershell,而没有 esc
序列。
我尝试将其插入到我的
.bashrc
set keyseq-timeout
中,或者插入到0
,或者一些大值,但没有任何帮助。
此外,这种情况也会发生在独立的 powershell 中,甚至在 cmd 中。
如何让它像以前一样工作?
当您从 Bash 环境(例如 WSL 或 Git Bash)调用时,它可以工作。
^[[A
[1],但缓冲的击键 does 在命令终止后生效;该行为与 Git Bash 中的行为相同,只是 ^[[A
不 打印。
(例如 cmd.exe
或 PowerShell)调用
时,该 shell不接收缓冲的击键;相反,它是由终端(控制台)本身处理。
no-op:光标在终端中向上移动一行,但随后 Windows 本机 shell 重新获得控制权并在原始行上打印其提示字符串,然后将光标放在末尾.
two shell这一事实有关,并且由于Bash shell随命令一起退出而缓冲的击键未被处理由 Bash 生成,并且不会传递到外部 Windows 本机 shell,从而导致终端模拟器对其进行解释。
解决方法:
如果目的是简单地回忆上一个命令并立即执行它,您可以使用PowerShell的Invoke-History
r
(可能是recall的缩写):
# Execute `make clean`, then recall and execute the previous command.
make clean; r
注意:如果您想让重新执行取决于make clean
信号成功,请使用
make clean && r
在PowerShell(核心)7+ 中,以及
make clean; if (0 -eq $LASTEXITCODE) { r }
在Windows PowerShell 中。这同样适用于下面的其他命令。 当然,如果您提前知道
make build
是您要执行的下一个命令,只需将其作为同一命令行的一部分即可;例如:
# PS 7+ syntax - only executes `make build` if `make clean` succeeded.
make clean && make build
如果您完全想模拟向上箭头行为,即如果您想调用上一个命令而不立即执行它,即如果您只想将其放置在命令行编辑缓冲区中:
# Helper function
function u {
(New-Object -ComObject WScript.Shell).SendKeys('{UP 2}')
}
u
r
:
make clean; u
^[
代表 ESC 字符,整个序列 - ESC [ A
- 大概是按下向上箭头键时xterm
兼容的终端模拟器发出的内容。许多 shell 会拦截此击键并将其解释为:调用最近提交的命令并将其放入命令行编辑缓冲区中。在没有 shell 的情况下,光标从当前行向上移动一行。