为什么“调用历史记录”挂在powershell中?

山姆·艾勒曼

如果我的上一个命令是类似'dir'的命令,那么invoke-history似乎可以正常工作。如果我的上一个命令是'vim $ profile'之类的东西,invoke-history将显示该命令并挂起。有没有什么办法解决这一问题?我在Powershell中进行的许多工作都涉及编辑脚本然后运行它……这已成为一个巨大的问题。

mklement0

Windows PowerShell 5.1 / PowerShell [Core] 7.0起,它看起来像一个bug

程序,诸如vim依赖于能够打印到终端(控制台)直接,无PowerShell的作为中介。

  • 通过直接调用,这可以按预期工作。

  • 通过via调用时Invoke-History,PowerShell似乎确实将其自身插入vim到终端之间,从而导致vim故障:

    • Invoke-History: Vim: Warning: Output is not to a terminal发出错误
    • vimUI并没有出现,即使vim运行,通过的事实,您可以键入证明:q,然后Enter退出。

该错误已在GitHub问题中报告


解决方法

您可以滚动自己的Invoke-History函数以放置在$PROFILE文件中,该文件从历史记录中手动检索并执行上一个命令:

function Invoke-History {
  [CmdletBinding(SupportsShouldProcess)]
  param(
    [string] $Id = (Get-History -Count 1).Id
  )
  $cmd = if ($Id -as [long]) {
      (Get-History -ErrorAction Stop -Id $Id).CommandLine
    } else {
      (Get-History).Where({ $_.CommandLine.TrimStart() -match ('^' + [regex]::Escape($Id)) }, 'Last').CommandLine
    }
  if (-not $cmd) { Throw "Cannot locate the history for command line $Id" }
  if ($PSCmdlet.ShouldProcess($cmd)) {
    # Note: Invoke-Expression is safe to use here, but
    #       should generally be avoided.
    Invoke-Expression $cmd
  }
}

注意:内置rihy别名将自动调用自定义函数而不是cmdlet,因为函数比cmdlet具有更高的命令查找优先级。


或者,使用其他方式从历史记录中执行命令

  • 键入#,然后输入以下内容之一:

    • 使用向上箭头键在命令历史记录中向后导航。
    • 输入上一个命令的一部分,然后按Tab以循环显示匹配的命令。
    • 键入要重新执行的命令数字(Id,如所示Get-History,然后按Tab显示该命令。
    • 按下Enter以提交显示的命令。
  • 使用PSReadLineReverseSearchHistory功能,Ctrl-R默认情况下绑定到组合键

    • 按下组合键并键入上一个命令的一部分:最近匹配的命令将自动显示;反复按组合键以循环显示所有匹配的命令。
    • Enter提交显示的命令或Tab先对其进行编辑。

注意:从PowerShell 7.0开始,只有该PSReadLine方法基于后者的持久性跨会话历史记录;#方法仅知道当前会话中的命令。


本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么历史记录和.bash_history不同,如何删除历史记录中的条目?

删除历史记录文件后,为什么在历史记录中仍然有较旧的命令?

为什么删除bash历史记录还不够?

为什么命令以空格开头而不显示在bash历史记录中?

为什么在 useEffect 的依赖数组中需要历史记录

从Bash历史记录中删除条目时,为什么会出现错误?

为什么分支名称未显示在git历史记录中?

为什么我的“连接”组件中没有历史记录道具?

为什么在freebsd历史记录中我看到带有*的命令,但从未执行?

为什么历史记录在Ubuntu中不起作用?

为什么找不到事件字符串命令,它在历史记录中的位置?

为什么Bash历史记录中的某些行变为“ *”?

为什么gcb中的历史记录无法按分支名称排序?

Windows中的文件历史记录是什么

为什么提交历史记录时GitHub不显示文件历史记录?

zsh中的命令历史记录

zsh中的命令历史记录

在 Reactjs 中推送历史记录?

在Linux中禁用历史记录

ipdb会话中的历史记录

Docker容器中的历史记录

组件中缺少历史记录

GitKraken中的文件历史记录

脚本中的Bash历史记录:`!#:*`

从bash脚本调用历史记录时“历史记录位置超出范围”

当我粘贴命令而不是键入命令时,为什么未将其添加到历史记录中

为什么我不能通过此循环从bash历史记录中删除多个条目

为什么不删除TFS中的文件然后重新创建它会清除历史记录?

为什么Bash历史记录不记录此命令?