假设我有一个我调用的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脚本中,但我对学习管道更感兴趣。
答案 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时,这非常有用。