我一直收到 Shell 错误消息,通常是由于错误的命令等原因,但由于不理解所提供的信息,无法调试这些消息的原因。
我一直在寻找文档,但找不到任何有关 sh 错误消息格式的文档。
示例: 如果我使用以下命令,它将失败,因为没有可用的“ipconfig”命令:
$ sh -c "ipconfig"
sh: 1: ipconfig: not found
我想了解的是该消息中的每个“字段”属于什么内容?我认为是:
[interpreter]: [???]: [command]: [error related to command]
我一生都无法确定这个数字指的是什么,我也无法确定我对其他字段的理解是否准确。
背景: 我正在调试一个用于自动化测试的Python2.7 pytest脚本,该脚本有很多地方正在执行shell命令。但是,我收到的输出是:
(32512, 'sh: 2: 2: not found')
我知道用于执行 shell 脚本的函数返回一个包含状态代码和输出的元组。我知道该状态代码本质上是“未找到命令”,并且错误消息也说明了这一点。另一个函数正在返回一个用于此命令的字符串,我认为发生的情况是,在此过程中的某个地方,一定传递了一个错误的参数,现在脚本正在尝试执行,基本上是
sh -c "2"
。但我不能确定,因为这些是我根据对这个错误消息的有限理解而做出的很多假设。
如果有人可以告诉我这个错误中的字段实际上意味着什么,我将永远感激不已!!
正如你猜测的那样,数字指的是行号;所以产生
sh: 2: 2: not found
的命令看起来像
sh -c '#!/bin/sh
2'
(显然第一行可以包含任何内容,也可以不包含任何内容)。
如果错误与特定命令无关(被信号杀死等),则 shell 显然不会将其归因于错误。因此,来自 shell 的错误消息的一般形式实际上就是
外壳: 行号: 错误
当然,许多错误会源自可能遵守或不遵守打印约定的实用程序
实用程序: 错误消息
标准错误。特别是,许多业余脚本无法在错误消息中包含自己的身份,有些甚至将错误消息发送到标准输出而不是标准错误。
郑重声明,从您自己的 shell 脚本执行此操作的方法类似于
echo "${0##*/}: error message" >&2
这通常会被封装在一个函数中。 (参数扩展
${0##*/}
从$0
的值中剥离任何路径前缀,其中包含当前脚本的名称。)
另外,不要忘记
exit
使用非零结果代码以编程方式向调用者发出信号,表明您的命令未成功。