通过管道传输到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”),引号是参数值中的文字字符,不受引号删除的约束。