如果我在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上编写一些脚本,是否有关于主要错误级别操作系统变量管理的其他关键差异?
答案 0 :(得分:3)
适用于Windows
%ERRORLEVEL%在任何命令失败的情况下为1,并且在成功执行除echo
之外的命令
在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