linux脚本运行出现bc,Shell脚本因使用管道连接符而出现执行错误的解决

本文介绍Shell脚本执行错误解决一例。问题的奇怪之处为里面Python的语句没有正确执行,可以用Python执行一些程序,但会报一些奇怪的错误。

相关说明

最近使用了以前编写的一个脚本(Shell),但是执行的结果有问题里面:有些语句没有被正确执行,期间重新安装过所需Python模块、换过脚本解释器,甚至将语句单独复制出来逐行执行,里面的语句没有一句有问题,都可以单独正确执行,重新建立文件在终端中执行,没有问题,想过是字符或者编码,将能够正确执行的文件重新命名替换,执行依然依然出错。其中Shell的错误代码是120,解释是Is a named type file。

最后锁定了问题所在,原因是在执行这个命令的时候,使用管道连接符的问题,又想起了以前使用sed的管道出现的一些莫名其妙的问题。

复现示例

在https://github.com/migvel/color_trace地址里面有一个转换脚本color_trace_multi.py。

新建一个test.sh文件,加上一句话:

python3 color_trace_multi.py -i test2.png -o test2.svg -c 3

给予可执行权限,用如下命令执行就报错:

./test.sh |  echo "123"

用如下命令执行就正确:

./test.sh

解释说明

类似的Shell代码,我没试出下列错误(没试 color_trace):

Is a named type file

倒是有其他错误:

$ python3 -c 'for i in range(6): print(i)' | echo 123

123

Exception ignored in: <_io.textiowrapper name="<stdout>" mode="w" encoding="utf-8">

BrokenPipeError: [Errno 32] Broken pipe

查到说:echo关闭了管道读端,此时发送SIGPIPE信号python3,默认杀进程。但python3选择触发BrokenPipeError异常,然后就这样了。

4c4d7f9588422e58337c40cca4d75117.png

d580bb500ae5f46866fc45190f1bb8b4.png

说明:应该是Python对信号处理的问题,用在shell里用$?获取退出的值是120,查了一下含义,其为Is a named type file而使用| echo 123,是为了不管前面的程序咋样,都能获得一个正确的退出信号和退出相关字符,现在已用其它方式解决。

相关主题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值