在包装的Bash脚本中设置管道

3

假设我有一个Python程序,我通过以下方式调用:

python main.py

我希望您能将此程序封装到一个名为execute的shell脚本中,以便可以在执行之前进行一些设置。请注意,保留HTML标记。
#!/bin/bash

# Do something interesting
python main.py

现在假设我想要使用管道。
./execute < inputData.txt > outputData.txt

如何将管道(或|管道)重定向到我的Python脚本?

类似于下面的示例,但更加通用(我不知道我的输入和输出文件的名称,或者是否存在管道,也许我只想要标准输入/输出)。

python main.py < inputData.txt > outputData.txt

一个快速的解决方法是将我的Python可执行文件直接运行,而不是将其包装在shell脚本中,但我更想了解管道的知识。

1个回答

5
在这种情况下,您不必在shell脚本中指定管道或重定向。管道和重定向更改标准输入、输出和错误处理。这些处理程序会被子进程继承,除非您另有说明。因此,当您运行execute < input.txt时,execute和它执行的python的标准输入处理程序将连接到input.txt。如果要更改execute设置的内容,则只需要在execute内部指定重定向或管道。

术语说明: <>>>重定向操作符,而不是管道。机制类似,但管道需要shell执行新进程。

编辑我不知道有什么办法让脚本获取与其stdin/stdout/stderr处理程序关联的文件名。在使用管道的情况下,没有这样的文件名!

此外,Bash还有一种进程替换功能,它是管道和重定向的混合体。执行execute < <(echo yes)将运行echo yes并将其输出放入一个特殊的文件名(例如/dev/fd/42)。特殊的文件名出现在命令行上。因此,结果类似于echo yes > /dev/fd/42 ; execute < /dev/fd/42。当您不想创建新的子shell时,这非常有用,而|通常会创建新的子shell。

1
感谢点赞者的支持,让我成功突破10k声望值! :D :D - cxw
非常感谢!那确实有帮助。回想起来,我的问题很愚蠢,这就是为什么我没有在SO上找到它的原因。感谢澄清。 - Andrei Cioara
2
@AndreiCioara 没有所谓的愚蠢问题 :) 。实际上,像“你不需要做任何特殊的事情”这样的答案通常很难找到,因为文档通常告诉您默认行为,而不解释它如何适用于不同的情况。祝你编程愉快! - cxw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接