为什么我在 Windows 终端中得到乱码结果?

Why am I getting gibberish result in Windows terminal?

我正在尝试比较 windows 终端中的版本。它在 Git Bash 中运行良好,但在 Windows 终端中它显示乱码和错误结果?

verlte() {
    [  "" = "`echo -e "\n" | sort -V | head -n1`" ]
}

verlt() {
    [ "" = "" ] && return 1 || verlte  
}

verlte 2.5.7 2.5.6 && echo "yes" || echo "no" # no
verlt 2.4.10 2.4.9 && echo "yes" || echo "no" # no
verlt 2.4.8 2.4.10 && echo "yes" || echo "no" # yes
verlte 2.5.6 2.5.6 && echo "yes" || echo "no" # yes
verlt 2.5.6 2.5.6 && echo "yes" || echo "no" # no

结果在Windows终端

结果 Git Bash

借鉴 , which references How to sort by file name the same way Windows Explorer does?,这是我尝试转换为 PowerShell 语法的尝试:

# compare two arbitrary version strings using natural sorting
# allows strings to contain non-numeric components
function verlte {
    param(
        [string]$v1,
        [string]$v2
    )

    function ToNatural {
        param( [string]$v )
        [regex]::Replace($v, '\d+', { $args[0].Value.PadLeft(20) })
    }
    
    (ToNatural $v1) -le (ToNatural $v2)
}

function verlt {
    param(
        [string]$v1,
        [string]$v2
    )

    if ($v1 -eq $v2) { return $false }
    verlte $v1 $v2
}

verlte 2.5.7 2.5.6 # False
verlt 2.4.10 2.4.9 # False
verlt 2.4.8 2.4.10 # True
verlte 2.5.6 2.5.6 # True
verlt 2.5.6 2.5.6 # False

您似乎在比较版本。在 PowerShell 和 .NET 框架中,已经有 [version] 可以做到这一点:

PS C:\Users> [version]"2.5.7" -le [version]"2.5.6"
False
PS C:\Users> [version]"2.4.10" -lt [version]"2.4.9"
False
PS C:\Users> [version]::new(2, 4, 8) -lt [version]::new(2, 4, 10)
True
PS C:\Users> [version]"2.5.6" -le [version]"2.5.6"
True
PS C:\Users> [version]::new(2, 5, 6) -lt [version]::new(2, 5, 6)
False

有关详细信息,请参阅 PowerShell Comparison Operators


请注意,Windows 终端是一个 终端不能运行 任何东西。与其他终端相同,如 conhost(旧 Windows 上的默认终端)、term、xterm、iterm、konsole... 运行s 命令的东西称为 shell 和 shell 必须连接到某个终端才能工作。所以说“运行ning in Windows Terminal”几乎没有意义,因为错误来自 shell。你的命令是一个 bash 命令,所以很明显 如果你在 Windows 终端中 运行 bash 那么它会 运行 正确 .不清楚您使用的 shell 但是

  • 在 PowerShell 中 [ "" = "`echo -e "\n" | sort -V | head -n1`" ] 完全无法解析,因为在 PowerShell 中 ` 是转义字符(这意味着您的命令不会终止),并且 =[/] 在 PowerShell 中是一个运算符,而不是 bash
  • 中的普通字符
  • 在cmd中$不是变量和参数替换的字符,`也没有特殊含义,所以如果你的路径中有[.exe那么cmd会将整个文字命令传递给 [ 命令,它将无法比较任何内容

每个 shell 都有自己的语法,不要试图 运行 为 shell 编写的命令用在另一个完全不同的