在Windows shell脚本与echo $?echo%ERRORLEVEL%? 在Linux中:行为有没有什么区别?

如果我在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不会修改与最后一个命令的错误级别关联的variables。
这对我来说是意外的,我花了一段时间来debugging一个脚本,因为我认为主要的行为是一样的

只要我经常在Windows或Linux shell上编写一些脚本,还有什么其他关键的差异要注意关于主要错误级别的操作系统variablespipe理?

对于Windows

在任何命令失败的情况下,%ERRORLEVEL%将为1,除了echo之外,成功执行命令后将变为0

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

当echo命令工作时

如果errorlevel在echo之前为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,回声后仍然为0

所以,在这两种情况下,echo命令似乎表现相同

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

 echo something && echo works || echo fails 

那么行为就会改变一点

当echo命令工作时

没有不同。 在运行echo命令之前,errorlevel不会改变,保持它的值。

当echo命令“失败”

使用echo something > file && echo works || echo fails 那么echo something > file && echo works || echo fails ,如果在运行echo之前errorlevel为1,它将保持其值。

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

对于Linux

每个不成功的命令输出$? value $? value将被设置为非零,并且每当命令的输出成功时,它将被设置zero