我想将stdin传递给bash脚本,传递给在该bash脚本中调用的python脚本


9

我有一个bash脚本正在调用一个Python脚本,我想file通过stdin 来提供其内容。像这样调用bash脚本:

./script.sh < file

和的内容script.sh

#! /usr/bin/env bash
pushd /some/python/virtual/environment/working/dir
source venv/bin/activate
python main.py ??????
deactivate
popd

我不知道要填写什么,??????file将给定的内容作为stdin传递给bash 脚本main.py

请注意,file可以大幅文本文件,并使用bash的read理想的。

要求在调用bash脚本时使用stdin。我很灵活地将任何东西传递给main.py

有什么想法可以解决这个难题吗?

加成

@cas的回答使我很清楚,我还需要解释在哪种情况下尝试使用script.sh

我想script.sh用作中的转发脚本~/.forward,内容如下:

|/path/to/script.sh

哪个后缀调用为/path/to/script.sh; 日志很清楚。使用简化版本的python脚本的简单测试,例如:

|/path/to/simple/main.py

证明后缀确实会main.py在标准输入上调用邮件的内容。但是这种组合似乎不起作用。


您是否在使用postfix自己的localLDA或其他内容(如procmail或)deliver?从内部运行时,您体内是否有任何东西~/.bashrc可能会干扰环境?也许通过在script.sh内部运行类似的东西来记录环境。main.pyscript.sh{ typeset -p ; echo } >> "/tmp/forward.log"
cas

Answers:


15

假设你的main.py脚本编写正确从标准输入读取,并在没有venv/bin/activate从标准输入(*)读取,??????应该是“什么都没有”。

bash脚本中没有先前的命令会在python之前使用stdin,因此python只会开始使用它。

#/bin/bash
pushd /some/python/virtual/environment/working/dir
source venv/bin/activate
python main.py
deactivate

或使main.py可执行文件并直接以./main.py...方式运行,无论哪种方式。

(*),如果有,你可能就无法做到这一点在所有的,没有丑陋的东西像捕捉所有标准输入到一个变量,然后通过管道或<<<重定向变量放到第一venv/bin/activate,然后main.py


对于这里发生的事情以及为什么起作用的一个非常明显的例子,请考虑以下sh脚本kitten.sh

#!/bin/sh
cat

它只是运行cat,开始从stdin读取并将其输入打印到stdout。


5
awww ...小猫非常可爱,有自己的shebang线。
cas

嗨@cas感谢您的广泛回答。而且,是的,它可以正常工作。我扩展了我的问题,以弄清楚我要在哪个上下文中使用它以及在什么地方不起作用。可能是这个SE是一个错误的论坛提出问题。
令人讨厌的

编辑花了我超过6分钟的时间;-)
昧的

如果脚本前面的其他命令需要使用stdin(对脚本的将来编辑等),则某些操作系统具有伪文件名,可以将其作为占位符传递。例如,在Linux的许多版本中,/dev/stdin有一个设备文件(或指向该文件的符号链接),该文件在读取时会做正确的事。当然,要权衡的是可移植性仅限于您知道其特殊名称的操作系统,例如,将本地变量分配给适当的假文件名,然后将该变量用作to的参数python main.py
Ti Strga

OP脚本的整个目的是为python设置环境,然后将stdin传递给main.py,因此这样做会破坏它。
cas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.