Windows shell脚本中的echo%ERRORLEVEL%与echo $?在Linux中:行为有什么不同吗?

时间:2014-04-03 21:01:22

标签: linux windows shell error-handling scripting

如果我在Windows中执行:

C:\>dir z:
Drive path not found.

C:\>echo %ERRORLEVEL%
1

C:\>echo %ERRORLEVEL%
1

C:\>echo %ERRORLEVEL%
1

但如果我在Linux中做的话:

Luis@Kenobi ~/Temporal/SUDO/Pruebas
$ ls /ppp
ls: unable to access /ppp: No such file or directory

Luis@Kenobi ~/Temporal/SUDO/Pruebas
$ echo $?
2

Luis@Kenobi ~/Temporal/SUDO/Pruebas
$ echo $?
0

Luis@Kenobi ~/Temporal/SUDO/Pruebas
$ echo $?
0

这应该发生,因为Windows中的echo不会修改与最后一个命令的错误级别相关联的变量。
这对我来说是意想不到的,我花了一段时间来调试脚本,因为我认为主要行为将是相同的

只要我经常在Windows或Linux shell上编写一些脚本,是否有关于主要错误级别操作系统变量管理的其他关键差异

1 个答案:

答案 0 :(得分:3)

适用于Windows

%ERRORLEVEL%在任何命令失败的情况下为1,并且在成功执行除echo 之外的命令

后将更改为0
  

在windows中,echo是一个奇怪的命令。让我们看看它的表现如何

当echo命令工作时

  

如果echo之前的errorlevel为0,则在echo之后,errorlevel将为0(明显的情况)

     

如果echo之前的errorlevel为1,则在echo之后,errorlevel将为1. Echo不会更改errorlevel

当echo命令"失败"

可以回声失败吗?让我们创造一个“失败”的案例。在同一目录中打开两个命令窗口。在第一个运行pause > file.txt以生成文件并在暂停命令等待按键时对其进行锁定。在第二个命令窗口中运行echo something > file.txt。在这种情况下,echo命令将失败,因为第一个命令窗口对文件进行锁定,因此第二个命令窗口无法写入文件。正确地说出回声没有失败,但重定向确实如此,但只是为了看看会发生什么

  

如果在运行echo之前errorlevel为1,则在echo(明显的情况)之后它仍为1

     

如果在运行echo之前errolevel为0,则在echo

之后它仍为0

因此,似乎echo命令在两种情况下的行为相同

但是如果我们将echo的执行方式改为

echo something && echo works || echo fails

然后行为改变了一点

当echo命令工作时

没有区别。 errorlevel不会更改,保持运行echo命令之前的值。

当echo命令"失败时#34;

然后使用echo something > file && echo works || echo fails,如果在运行echo之前errorlevel为1,则保持其值。

  

但是如果errorlevel为0并且echo命令失败,则在这种情况下,使用   这个命令的构造,errorlevel将显示失败和   将其值更改为1

适用于Linux

每个不成功的命令输出$? value将设置为非零&对于命令的每个成功输出,它将被设置为zero