[已解决]脚本执行错误
Tofloor
poster avatar
ylxdxx
deepin
2020-11-21 07:28
Author

最近使用了以前编写的一个脚本(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


相关的解释说明可以参见12楼及其中的连接


Reply Favorite View the author
All Replies
ylxdxx
deepin
2020-11-21 07:31
#1

排查了一晚上,始料未及

Reply View the author
神末shenmo
deepin
Spark-App
Q&A Team
2020-11-21 07:35
#2


bash问题么

Reply View the author
无名
deepin
2020-11-21 07:39
#3

没看懂,是 Python3 没有输出么?

echo 不会处理 标准输入,因此 Python3 的版本输出被吃掉了啊

Reply View the author
ylxdxx
deepin
2020-11-21 07:43
#4
神末shenmo


bash问题么

zsh也是一样

Reply View the author
ylxdxx
deepin
2020-11-21 07:45
#5
无名

没看懂,是 Python3 没有输出么?

echo 不会处理 标准输入,因此 Python3 的版本输出被吃掉了啊

里面Python的语句没有正确执行,可以用Python执行一些程序,会报一些奇怪的错误

Reply View the author
无名
deepin
2020-11-21 07:47
#6
ylxdxx

里面Python的语句没有正确执行,可以用Python执行一些程序,会报一些奇怪的错误

上面的代码没说明啥吧,有具体代码更好分析

Reply View the author
ylxdxx
deepin
2020-11-21 07:59
#7
无名

上面的代码没说明啥吧,有具体代码更好分析

例如https://github.com/migvel/color_trace这个里面python转换的脚本,用上面的方式会出错

Reply View the author
无名
deepin
2020-11-21 08:08
#8
ylxdxx

例如https://github.com/migvel/color_trace这个里面python转换的脚本,用上面的方式会出错

看看你的 Shell 部分

Reply View the author
ylxdxx
deepin
2020-11-21 09:29
#9
无名

看看你的 Shell 部分

帖子重新编辑了,见楼上

Reply View the author
忘记、过去
deepin
2020-11-21 09:50
#10

好像应该执行

./test.sh && echo "123"

这样才对吧," | "这个一般不是处理输出内容时候才用得到吗?

Reply View the author
无名
deepin
2020-11-21 10:02
#11
ylxdxx

帖子重新编辑了,见楼上

依旧没看懂这句 Shell 作用是啥


  1. color_trace 执行完后,会输出某些信息?然后管道符传给 echo ?可是 echo 不会读取上一个命令输入的内容啊
  2. 如10楼所说,你想执行成功后,再输出“成功”嘛?那应该把 管道符“|”换成“&&”啊

Reply View the author
无名
deepin
2020-11-21 11:40
#12

类似的 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='' mode='w' encoding='utf-8'>
BrokenPipeError: [Errno 32] Broken pipe

查到一篇文章echo 关闭了管道读端,此时发送 SIGPIPE 信号给 python3,默认杀进程。

但 python3 选择触发 BrokenPipeError 异常,然后就这样了……

Reply View the author
Feng Yu
deepin
2020-11-21 19:00
#13

python3 -c 'for i in range(6): print(i)' | cat -


不会有任何报错

Reply View the author
ylxdxx
deepin
2020-11-21 23:05
#14
无名

类似的 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='' mode='w' encoding='utf-8'>
BrokenPipeError: [Errno 32] Broken pipe

查到一篇文章echo 关闭了管道读端,此时发送 SIGPIPE 信号给 python3,默认杀进程。

但 python3 选择触发 BrokenPipeError 异常,然后就这样了……

感谢解答,应该是Python对信号处理的问题,我用 在shell 里用 $? 获取退出的值是120,查了一下含义,其为 Is a named type file 而使用

| echo 123

是为了不管前面的程序咋样,都能获得一个正确的退出信号和退出相关字符,现在已用其它方式解决,再次感谢

Reply View the author