管道到头部导致从python调用的shell脚本中的管道损坏
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了管道到头部导致从python调用的shell脚本中的管道损坏,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1312字,纯文字阅读大概需要2分钟。
内容图文
![管道到头部导致从python调用的shell脚本中的管道损坏](/upload/InfoBanner/zyjiaocheng/971/a041e93ffc66482aac08cd5e874a54a7.jpg)
我有一个命令,我将运行生成随机字符串:
var=`< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c8`
当我在交互式bash会话中运行此命令时,我绝对没有错误.但是,当我将此命令放入脚本并将其作为脚本运行时,我得到了由tr指示的Broken pipe错误.我已经阅读了几个相关的主题,但仍然没有答案为什么脚本和交互行为是不同的,有没有办法用shell选项或其他东西来控制它?
编辑I:
关于给出的评论,我发现可以通过以下方式控制指示损坏的管道错误:
trap - SIGPIPE # to ignore errors
和
trap "" SIGPIPE # to display errors
编辑二:
好吧,我提供了有关复制条件的错误信息.最后,似乎python包装器使用os.system()调用脚本引起的问题:
python -c "import os; os.system('sh -c \"< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c8\"')"
给定的行产生与使用的OS无关的管道错误.
编辑III:
这个主题在这里讨论过:
https://mail.python.org/pipermail/python-dev/2005-September/056341.html
解决方法:
如果其中一个父进程陷阱sigpipe,那么管道将继承ignore信号处理,这将导致您遇到此问题.
这可以(安全地)复制:
( trap '' pipe; var=`< /dev/urandom tr -dc _A-Z-a-z-0-9 | head -c8 )
通常,head -c8命令很快就会完成,此时stdin将关闭.因为它的stdin是一个连接到tr的stdout的管道,所以tr现在不再有意义写入它的stdout.一旦尝试,系统将使用SIGPIPE杀死它.
除非tr忽略此信号或从其父级继承了此信号的ignore(SIG_IGN)处置.然后写入tr的破坏标准输出将简单地导致常规错误并将errno设置为EPIPE,此时tr很可能会串行化并将此错误输出到其stderr并退出.
内容总结
以上是互联网集市为您收集整理的管道到头部导致从python调用的shell脚本中的管道损坏全部内容,希望文章能够帮你解决管道到头部导致从python调用的shell脚本中的管道损坏所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。