作者:趣校区导购网 | 来源:互联网 | 2022-12-23 10:58
假设我有一个我调用的python程序
python main.py
我想将这个程序包装成一个调用的shell脚本execute
,可以事先做一些设置
#!/bin/bash
# Do something interesting
python main.py
现在让我们说我想使用管道
./execute outputData.txt
我应该如何将这些管道(或|
管道)重定向到我的python脚本?
像下面的东西,但更通用(我不知道我的输入和输出文件的名称,或者是否有管道,也许我只是想要stdin/stdout)
python main.py outputData.txt
一个快速的黑客就是让我的python可执行文件运行而不是将它包装在shell脚本中,但我更感兴趣的是学习管道.
1> cxw..:
在这种特殊情况下,您不必在shell脚本中指定管道或重定向.管道和重定向更改标准输入,输出和错误句柄.除非您另有说明,否则这些句柄将由子进程继承.因此,当您运行时execute ,两者的标准输入句柄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 .当您不想创建新的子shell时,这很有用|
.
@AndreiCioara没有一个愚蠢的问题:).实际上,通常很难找到像"你不需要做任何特殊事情"这样的答案,因为文档通常会告诉你默认行为而不解释它如何适用于不同情况.快乐的黑客!