典型的 sh 错误消息中的每个字段的含义是什么?前任。 “sh:1:ipconfig:未找到”

问题描述 投票:0回答:1

我一直收到 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"
。但我不能确定,因为这些是我根据对这个错误消息的有限理解而做出的很多假设。

如果有人可以告诉我这个错误中的字段实际上意味着什么,我将永远感激不已!!

shell sh
1个回答
0
投票

正如你猜测的那样,数字指的是行号;所以产生

sh: 2: 2: not found
的命令看起来像

sh -c '#!/bin/sh
2'

(显然第一行可以包含任何内容,也可以不包含任何内容)。

如果错误与特定命令无关(被信号杀死等),则 shell 显然不会将其归因于错误。因此,来自 shell 的错误消息的一般形式实际上就是

外壳: 行号: 错误

当然,许多错误会源自可能遵守或不遵守打印约定的实用程序

实用程序: 错误消息

标准错误。特别是,许多业余脚本无法在错误消息中包含自己的身份,有些甚至将错误消息发送到标准输出而不是标准错误。

郑重声明,从您自己的 shell 脚本执行此操作的方法类似于

echo "${0##*/}: error message" >&2

这通常会被封装在一个函数中。 (参数扩展

${0##*/}
$0
的值中剥离任何路径前缀,其中包含当前脚本的名称。)

另外,不要忘记

exit
使用非零结果代码以编程方式向调用者发出信号,表明您的命令未成功。

© www.soinside.com 2019 - 2024. All rights reserved.