在包装bash脚本中设置管道

时间:2018-03-24 13:35:41

标签: bash shell redirect pipe child-process

假设我有一个我调用的python程序

python main.py

我想将这个程序包装成一个名为execute的shell脚本,可以事先进行一些设置

#!/bin/bash

# Do something interesting
python main.py

现在让我们说我想使用管道

./execute < inputData.txt > outputData.txt

我应该如何将这些管道(或|管道)重定向到我的python脚本?

类似下面的东西,但更通用(我不知道我的输入和输出文件的名称,或者是否有管道,也许我只想要stdin / stdout)

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

快速破解就是让我的python可执行文件运行而不是将其包装在shell脚本中,但我对学习管道更感兴趣。

1 个答案:

答案 0 :(得分:5)

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

关于术语的说明:<>>>redirection运算符,而不是管道。只有|是管道。机制类似,但管道要求shell执行新进程。

编辑我不知道脚本获取与其stdin / stdout / stderr句柄关联的文件名的任何方法。在管道的情况下,没有这样的文件名!

另外,bash有一个process substitution功能,它是一种管道和重定向的混合。 execute < <(echo yes)将运行echo yes,并将其输出放在特殊文件名中(例如/dev/fd/42)。特殊文件名在命令行中。结果就像echo yes > /dev/fd/42 ; execute < /dev/fd/42。当您不想创建|通常执行的新子shell时,这非常有用。