为啥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 = 146python -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修改?的主要内容,如果未能解决你的问题,请参考以下文章