- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
为什么 PowerShell 在下面的第二个示例中显示出令人惊讶的行为?
首先,举一个理智行为的例子:
PS C:\> & cmd /c "echo Hello from standard error 1>&2"; echo "`$LastExitCode=$LastExitCode and `$?=$?"
Hello from standard error
$LastExitCode=0 and $?=True
没有惊喜。我向标准错误打印一条消息(使用 cmd
的 echo
)。我检查变量 $?
和 $LastExitCode
。正如预期的那样,它们分别等于 True 和 0。
但是,如果我要求 PowerShell 通过第一个命令将标准错误重定向到标准输出,我会得到一个 NativeCommandError:
PS C:\> & cmd /c "echo Hello from standard error 1>&2" 2>&1; echo "`$LastExitCode=$LastExitCode and `$?=$?"
cmd.exe : Hello from standard error
At line:1 char:4
+ cmd <<<< /c "echo Hello from standard error 1>&2" 2>&1; echo "`$LastExitCode=$LastExitCode and `$?=$?"
+ CategoryInfo : NotSpecified: (Hello from standard error :String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
$LastExitCode=0 and $?=False
我的第一个问题,为什么会出现 NativeCommandError?
其次,为什么cmd
运行成功,$LastExitCode
为0时,$?
为False? PowerShell 的文档 about automatic variables没有明确定义 $?
。当且仅当 $LastExitCode
为 0 时,我一直认为它为 True,但我的示例与此相矛盾。
以下是我在现实世界(简化版)中遇到这种行为的方式。这真的是 FUBAR。我正在从另一个调用一个 PowerShell 脚本。内部脚本:
cmd /c "echo Hello from standard error 1>&2"
if (! $?)
{
echo "Job failed. Sending email.."
exit 1
}
# Do something else
简单地以 .\job.ps1
运行它,它工作正常,并且没有发送电子邮件。但是,我是从另一个 PowerShell 脚本调用它的,记录到文件 .\job.ps1 2>&1 > log.txt
。在这种情况下,将发送一封电子邮件!您在脚本外部使用错误流执行的操作会影响脚本的内部行为。 观察现象会改变结果。这感觉更像是量子物理学而不是脚本!
[有趣的是:.\job.ps1 2>&1
可能会或不会爆炸,这取决于你在哪里运行它]
最佳答案
(我使用的是 PowerShell v2。)
“$?
”变量记录在 about_Automatic_Variables
中:
$? Contains the execution status of the last operation
这是指最近的 PowerShell 操作,而不是上次外部命令,后者是您在 $LastExitCode
中获得的内容。
在您的示例中,$LastExitCode
为 0,因为最后一个外部命令是 cmd
,它成功回显了一些文本。但是 2>&1
导致发送到 stderr
的消息被转换为输出流中的错误记录,这告诉 PowerShell 在上次操作,导致 $?
为 False
。
为了进一步说明这一点,请考虑以下内容:
> java -jar foo; $?; $LastExitCodeUnable to access jarfile fooFalse1
$LastExitCode
是 1,因为那是 java.exe 的退出代码。 $?
为 False,因为 shell 做的最后一件事失败了。
但如果我所做的只是将它们调换:
> java -jar foo; $LastExitCode; $?Unable to access jarfile foo1True
... 然后 $?
为 True,因为 shell 所做的最后一件事是向主机打印 $LastExitCode
,这是成功的。
最后:
> &{ java -jar foo }; $?; $LastExitCodeUnable to access jarfile fooTrue1
...这似乎有点违反直觉,但 $?
现在是 True,因为脚本 block 的执行成功,即使在其中运行的命令不是。
返回到 2>&1
重定向....导致错误记录进入输出流,这就是关于 NativeCommandError
。 shell 正在转储整个错误记录。
当您只想通过管道将
stderr
和 stdout
放在一起以便将它们合并到一个日志文件中时,这可能会特别烦人或者其他的东西。谁想让 PowerShell 插进他们的日志文件???如果我执行 ant build 2>&1 >build.log
,那么任何转到 stderr
的错误都会附加 PowerShell 的 nosey $0.02,而不是在我的日志文件中获取干净的错误消息。
但是,输出流不是文本 流!重定向只是对象 管道的另一种语法。错误记录是对象,因此您所要做的就是在重定向之前将该流上的对象转换为字符串:
来自:
> cmd /c "echo Hello from standard error 1>&2" 2>&1cmd.exe : Hello from standard errorAt line:1 char:4+ cmd &2" 2>&1 + CategoryInfo : NotSpecified: (Hello from standard error :String) [], RemoteException + FullyQualifiedErrorId : NativeCommandError
收件人:
> cmd /c "echo Hello from standard error 1>&2" 2>&1 | %{ "$_" }Hello from standard error
...并重定向到一个文件:
> cmd /c "echo Hello from standard error 1>&2" 2>&1 | %{ "$_" } | tee out.txtHello from standard error
...或者只是:
> cmd /c "echo Hello from standard error 1>&2" 2>&1 | %{ "$_" } >out.txt
关于windows - $LastExitCode=0,但 $?=False 在 PowerShell 中。将 stderr 重定向到 stdout 会给出 NativeCommandError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10666101/
我想阅读 php://stderr。怎么做到的? php://stderr 和 STDERR 是否写入同一个文件?因为在写入 php://stderr 后,我尝试使用 stream_get_conte
我不确定这个问题是 Python 还是 shell 问题。 我有一个 Python 程序,它在命令上使用子进程调用,该命令可以在 stderr 上发出错误消息。我自己的程序也使用 sys.stderr
如何重定向命令的输出,以便 stdout 和 stderr 都记录在文件中,并且我仍然希望 stderr 显示为输出。 我也不想使用 bash 来执行此操作。有这样的办法吗? 最佳答案 这很简单: $
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
我得到了以下批处理命令 echo 1 & echo 2 1>&2 & echo 3 有时这会打印 1 2 3有时 132 我怎样才能控制顺序?我必须得到订单。 是否有启用以下功能的命令? echo 1
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Ruby $stdout vs. STDOUT STDERR 通常比使用 $stderr 更受青睐,还是相反
这是我经常尝试完成的任务。我想将 stderr 和 stdout 都记录到日志文件中。但我只想打印到控制台 stderr。 我尝试过使用 tee,但是一旦我使用“2>&1”合并了 stderr 和 s
我想要做的是将 stderr 重定向到 stdout,而不更改 stderr 的输出。 比如说,命令在stderr中有输出,我想将stderr中的所有内容输出到屏幕,同时还通过grep处理信息并将其保
我正在尝试重定向一些 bash 脚本输出。我想做的是: ./some_script.sh 2> error.log >> all_output.log 2>&1 我想将 stderr 放在一个文件中,
我想将 stdout 和 stderr 的输出重定向到一个公共(public)文件: ./foo.sh >stdout_and_stderr.txt 2>&1 但也只是将 stderr 重定向到一个单
我想运行几个命令,并将所有输出捕获到日志文件中。我还想将任何错误打印到屏幕上(或者可以选择将输出邮寄给某人)。 这是一个例子。以下命令将运行三个命令,并将所有输出(STDOUT 和 STDERR)写入
在其他语言中(如 bash 和 Python),当我们生成一个子进程时,这个新进程将从父进程继承 stdout 和 stderr。这意味着子进程的任何输出都将打印到终端以及父进程的输出。 我们如何在
这个问题在这里已经有了答案: IO Redirection - Swapping stdout and stderr (4 个答案) 关闭 7 年前。 我想将应该转到 stdout 的所有内容重定向
我有一个 shell 脚本,我想将其 stdout 和 stderr 写入日志文件。我知道这可以通过 sh script.sh >> both.log 2>&1 但是,我还想同时将 stderr 写入
git clone 将其输出写入 stderr,如记录 here .我可以使用以下命令重定向它: git clone https://myrepo c:\repo 2>&1 但这会将所有输出(包括错误
以下将 stdout 写入日志文件并打印 stderr: bash script.sh >> out.log 这再次将 stdout 和 stderr 写入日志文件: bash script.sh >
我正在调试一个在 PHP 5.4 上使用 Slim 和 NotORM 的项目。将 NotORM 设置为 Debug模式时,NotORM 跟踪语句: fwrite(STDERR, "$backtrace
到目前为止我所做的是: #!/bin/bash exec 2> >(sed 's/^/ERROR= /') var=$( sleep 1 ; hostname ;
我在远程机器上通过 SSH 执行一系列操作,我正在传输它的标准输出和标准错误,然后由写入器使用它,写入本地标准输出和标准错误,以及字节缓冲区。 就在编写器使用它之前,我想对其执行一系列字符串操作,然后
现在我有一些使用 Popen.communicate() 的代码从子进程(设置 stdin=PIPE 和 stderr=PIPE)运行命令并捕获 stderr 和 stdout。 问题在于 commu
我是一名优秀的程序员,十分优秀!