停止使 shell 解释向上箭头

问题描述 投票:0回答:1

我将描述第一个环境:

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 powershell gnu-make ansi-escape
1个回答
0
投票
  • 当您从 Bash 环境(例如 WSL 或 Git Bash)调用时,它可以工作。

      在 WSL 中,如果在命令仍在运行时按向上箭头,则会打印
    • ^[[A
      [1],但缓冲的击键 does 在命令终止后生效;该行为与 Git Bash 中的行为相同,只是 ^[[A
       
      打印。
  • 当从本机 Windows shell

    (例如 cmd.exe 或 PowerShell)调用

    时,该 shell 
    接收缓冲的击键;相反,它是由终端(控制台)本身处理。

    • 这实际上是一个

      no-op:光标在终端中向上移动一行,但随后 Windows 本机 shell 重新获得控制权并在原始行上打印其提示字符串,然后将光标放在末尾.

    • 我不清楚确切的原因,但我怀疑这与涉及

      two shell这一事实有关,并且由于Bash shell随命令一起退出而缓冲的击键未被处理由 Bash 生成,并且不会传递到外部 Windows 本机 shell,从而导致终端模拟器对其进行解释。

        坦率地说,如果过去的行为有所不同,也就是说,如果这曾经有效过,我会感到惊讶 - 但如果您能指出它起作用的特定场景,请告诉我们。

解决方法

如果目的是简单地回忆上一个命令

并立即执行它,您可以使用PowerShell的Invoke-History

cmdlet,其内置别名是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
    

    
    
[1]
^[

代表 ESC 字符,整个序列 - ESC [ A

 - 大概是按下向上箭头键时 
xterm
 兼容的终端模拟器发出的内容。许多 shell 会拦截此击键并将其解释为:调用最近提交的命令并将其放入命令行编辑缓冲区中。在没有 shell 的情况下,光标从当前行向上移动一行。

© www.soinside.com 2019 - 2024. All rights reserved.