此stackoverflow answer解释了什么是Linux true命令。我的问题是,Powershell(v5 / v6)是否也提供了真正的命令?
我已经在Google周围搜索,使用过Get-help *true*
,但找不到任何相关内容。
Thx
答案 0 :(得分:4)
简而言之:
没有与true
和false
Unix实用程序等效的PowerShell。
由于PowerShell的条件和错误处理与bash
之类的POSIX类似外壳程序有很大不同,因此不需要它们。
Unix实用程序true
的主要用途是在您故意忽略前一个命令的失败(通过< em> nonzero 退出代码),例如 POSIX之类的外壳程序,例如0
,例如在条件语句中或带有未处理失败中止选项set -e
实际上。
bash
或其对应的true
都不产生任何输出-它们的唯一目的是设置退出代码。
PowerShell本身不使用退出代码(尽管您可以使用false
设置退出代码以使外部呼叫者受益),并且其条件不会< / em>对他们采取行动。
PowerShell的自动exit <n>
变量在摘要上类似于POSIX类shell中的$?
,但它报告的是 Boolean >,而类似POSIX的shell报告退出代码;类似于POSIX的外壳中包含$?
的{{1}}类似于PowerShell中包含$?
的{{1}}。
PowerShell永远不会对0
隐式地起作用,但是您可以在PowerShell条件条件中显式地使用它,因此以下两个-为了简化而设计-命令等效:
$?
PowerShell具有自动的$true
和$?
变量(概念上是常量),它们是布尔值值 >用于与输出(数据),设置不可见状态信息 (退出代码)的非命令进行比较。
请继续阅读以获取背景信息。
在像# POSIX-like shells:
# Event though the `ls` command fails `|| true` makes the overall
# command succeed.
if ls /nosuchfile || true; then echo success; fi
# PowerShell:
# `$?` would reflect `$false` after the failed `ls` command.
# `$null = $null` is a dummy command that resets `$?` to `$true`
# `$?` is then *output* for the `if` to test.
if ($(ls /nosuchfile; $null = $null; $?)) { 'success' }
这样的类似 POSIX的外壳中,条件操作在命令的退出代码上运行,即(执行后)< em>状态信息 ,而不是其输出。
相反, PowerShell 条件语句对命令或表达式 output 即 data 而不是状态信息进行操作。
简而言之:
类似POSIX的外壳中的条件对不可见的退出代码起作用,并通过通过成功传递输出(stdout输出)。
PowerShell中的条件作用于成功输出,并在过程中消费。
两个shell均通过 error 输出(stderr)。
您可以使用自动$true
变量,该变量的行为取决于手边的命令是PowerShell本地命令还是外部程序(例如Unix实用程序):
外部程序:如果程序的退出代码为$false
,则bash
反映$?
,否则0
这类似于POSIX类外壳程序(例如$?
)中的内置$true
变量,不同之处在于$false
包含实际的退出代码< / em>;也就是说,执行外部程序后,在类似POSIX的外壳中包含$?
的{{1}}与在PowerShell中包含bash
的{{1}}相同。
$?
变量,该变量反映最近执行的外部程序(PowerShell)的退出代码。 -native命令通常不设置退出代码,尽管您可以在脚本中使用$?
,主要用于向外部呼叫者报告退出代码。 PowerShell本机命令(cmdlet,函数,脚本):如果该命令从根本上没有失败并且没有写入PowerShell的错误,则0
为$?
流(例如使用$true
;请注意,默认情况下,外部程序的 stderr 输出不会不写入PowerShell的错误流)。
$LASTEXITCODE
因此不一定告诉您给定命令是否认为其整体执行成功; exit <n>
为$?
仅告诉您已报告一些错误。$true
语句中包装命令调用,这可以帮助您将非终止与终止< / em>错误(默认情况下,只有后者会触发Write-Error
块); 在PowerShell中使用$?
并不常见,因为故障通常是通过
$?
通用参数/ $false
首选项变量和/或try { ... } catch { ... }
语句。
也就是说,这些方法不能用于 外部程序 ,其中测试catch
或$?
是必须 来检测失败。
This GitHub discussion和this RFC draft要求将外部程序与PowerShell的错误处理更好地集成。
有关PowerShell错误处理的全面概述,请参见this GitHub issue。
答案 1 :(得分:1)
您正在寻找的是the about_Automatic_Variables
topic,其中描述了变量$true
和$false
。
我将此作为答案写出来,因为我想指出一个“陷阱”,我遇到了以下这些值:0
和1
等于$false
和{{ 1}}。
$true
与此同时,字符串$false -eq 0 # => True
$false -eq $null # => False - not false-y?
$true -eq 1 # => True
$true -eq 2 # => True - appears to be truth-y
不是。
'false'
由于某种原因,$false -eq 'False' # => False
等于一个空字符串:
$false
字符串$false -eq '' # => True
$false -eq [string]::Empty # => True
等于'true'
(实际上,任何非零数字,并且任何非空字符串都是):
$true
在探索这个答案的过程中,我意识到很多$true -eq 'True' # => True
比较的结果都是对$true
的评估,因此可以安全地假设与bool常数的比较是true-y / false-y。 / p>
以下是与True
比较的值(这使得以下比较返回$false
):
$true
我发现对两个测试均未通过测试的唯一比较是$false -eq '' # Empty string
$false -eq 0 # Zero
$false -eq @() # Empty array
(并非100%否是):
$null
在某些其他语言中,求得$false -eq $null # => False
$true -eq $null # => False
的边际案例的最后一个例子是空的$false
(或字典):
[hashtable]
总结@Joey在评论中的内容:
$true -eq @{} # => True