如果我在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