为什么我在 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 编写的命令用在另一个完全不同的
我正在尝试比较 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
借鉴
# 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 编写的命令用在另一个完全不同的