为啥python脚本返回的值会被shell修改?

Posted

技术标签:

【中文标题】为啥python脚本返回的值会被shell修改?【英文标题】:Why does the value returned by python script gets modified by the shell?为什么python脚本返回的值会被shell修改? 【发布时间】:2018-10-31 06:55:05 【问题描述】:

我的pythonscript看起来像这样

#!/usr/bin/python3
#File Name: pythonScript.py
from sys import exit
if '__name__'=='__main__':exit(402)

这是shell脚本

python3 pythonScript.py
echo $?

它打印 146。 402如何映射到146?诸如此类的其他一些对是 (402, 146), (100,0), (0, 0), (56, 0) 等。

python 脚本可以以这种方式将值返回给 shell,? 是捕获这个的正确变量吗?

我的机器版本是这个,如果这很重要的话。

4.4.0-89-generic #112-Ubuntu SMP Mon Jul 31 19:38:41 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

【问题讨论】:

您的问题已经在***.com/questions/9426045/… 中有答案,例如范围 0..255 之外的任何值都以 256 为模处理(退出状态存储在 8 位值中)。 402 % 256 = 146 python -c 'exit(100)' 按预期为我在$? 中生成 100。您问题中的其他“对”似乎不正确(或者我误解了您要说的内容)。 【参考方案1】:

在bash中,退出码只有低8位可见,402的低8位是146:

>>> 402 & 0b11111111
146

【讨论】:

感谢您的修复。现在这不是不准确的,但仍然模糊地暗示外壳在其中发挥了作用;它没有。看我的回答。 @tripleee 是的,等待*家庭系统调用会进行截断。 @tripleee 实际上,在 FreeBSD 下,通过waitid 调用,您可以获得完整的 32 位退出状态。【参考方案2】:

这不是外壳。系统调用接口只容纳一个无符号的 8 位数字;所以可以通信的最大值是255。

如果您编写了一个 C 程序,其 int main() 尝试使用 return(402);,而您在另一个 C 程序中使用 exec 调用它,而没有任何 shell,也会发生同样的事情。

【讨论】:

以上是关于为啥python脚本返回的值会被shell修改?的主要内容,如果未能解决你的问题,请参考以下文章

为啥返回变量的值会改变?

ajax获取java后台的返回值,long的值为啥会四舍五入解决办法

shell脚本命令行参数里的空白符

为啥附加到列表的值会动态变化?

python函数使用参数技巧笔记

关于python中的列表问题。把子列表当做母列表的元素,对子列表进行操作时,之前已添加的子列表的值会被改