通过管道传输到BASH的python打印输出将导致;“断管”;
我有一个通过管道传输到BASH的python打印输出将导致;“断管”;,python,bash,pipe,Python,Bash,Pipe,我有一个python脚本,它向标准输出一个文件列表,例如: $。/myscript.py “文件a.txt”“文件b.txt”“文件c.txt” 我想用更少的时间打开这些文件 更少$ 断管错误:[Errno 32]断管 我认为这可能与@Jon Clements在文章中提到的问题相同 ,即管道完工;但我不确定。我也尝试了@chepner的解决方案(可能是错误的),但它给出了相同的错误 我怎样才能解决这个问题?我知道混合使用BASH和Python是不好的做法 顺便说一句,python脚本使用以下语
python
脚本,它向标准输出一个文件列表,例如:
$。/myscript.py
“文件a.txt”“文件b.txt”“文件c.txt”
我想用更少的时间打开这些文件
更少$
断管错误:[Errno 32]断管
我认为这可能与@Jon Clements在文章中提到的问题相同
,即管道完工;但我不确定。我也尝试了@chepner的解决方案(可能是错误的),但它给出了相同的错误
我怎样才能解决这个问题?我知道混合使用BASH和Python是不好的做法
顺便说一句,python脚本使用以下语句的循环来生成文件名列表:
print(““+filename+”,sep=“”,end=”)
另外,当我手动将输出复制并粘贴到
less
时,它工作正常 在文件名周围加引号没有帮助。你应该做的是
xargs-0
eval
,出于安全原因,这不是一个好主意。您的命令应该类似于
./myscript.py | xargs -0 less
作为一种技巧,如果文件名很简单(即没有空格,没有全局字符),您可以修改/myscript.py
,只输出空格分隔的文件名(没有引号),然后运行
less $(myscript.py)
因为
less
只接受文件名参数。python脚本使用以下语句的循环来生成文件名列表
-Bash可以很好地完成这项工作,并且您不需要python python脚本比这一行复杂得多:它通过内容过滤更大的文件集。我之所以包含这段代码,是因为我认为它可能需要编辑。您能将它们之间的分隔符更改为null,并删除引号吗?如果是这样的话,您可以通过管道连接到xargs。您的解决方案是有效的。我在文件名中有空格,因此引用。你能解释两件事吗:首先,为什么在提示符下键入less“foo bar.txt”
效果很好,但是在引用中不能使用返回“foo bar.txt”
的python脚本是很好的安全性,这就是为什么less$(myscript.py)的原因
只有在您知道myscript.py
返回的文件不会通过分词或路径名扩展进行更改时才是安全的。当shell处理less“foo.txt”
时,它会在将字符串foo.txt
传递给less
之前删除语法引号。但是,当引号是参数扩展的一部分时,例如f=''foo.txt';小于$foo
(或在本例中小于“$foo”),引号是参数值中的文字字符,不受引号删除的约束。