У меня есть скрипт 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
данного сценария bash как stdin в сценарий python main.py
.
Обратите внимание , что file
может быть существенным текстовый файл и использовать в Bash read
является не желательным.
Использование stdin при вызове скрипта bash является обязательным. Я гибкий, чтобы передать все, что угодно main.py
.
Есть какие-нибудь идеи, как решить эту головоломку?
прибавление
Ответ @cas дал мне понять, что мне также нужно объяснить, в каком контексте я пытаюсь использовать script.sh
.
Я хочу использовать script.sh
в качестве сценария пересылки~/.forward
, с содержанием:
|/path/to/script.sh
Какой постфикс называется как /path/to/script.sh
; журнал ясно об этом. Простой тест с использованием урезанной версии скрипта Python, например:
|/path/to/simple/main.py
Демонстрирует, что postfix выполняет вызов main.py
с содержимым почты на stdin. Но комбинация, похоже, не работает.
источник
local
LDA postfix или что-то еще, напримерprocmail
илиdeliver
? есть ли в вас~/.bashrc
что-то, что может нарушить окружающую среду, как видно изmain.py
бега изнутриscript.sh
? может быть, войти в среду, запустив что-то вроде{ typeset -p ; echo } >> "/tmp/forward.log"
в script.sh.Ответы:
Предполагая, что ваш
main.py
сценарий правильно написан для чтения из stdin и что ничего неvenv/bin/activate
читает из stdin (*),??????
должно быть «вообще ничего».В bash-скрипте нет предыдущих команд, которые будут использовать stdin до python, поэтому python просто начнет его использовать.
Или сделайте
main.py
исполняемый файл и запустите его напрямую как./main.py
... работает так же, в любом случае.(*) если бы это было так, вы, вероятно, не смогли бы сделать это вообще, без чего-то уродливого, например, захват всего stdin в переменную и затем
<<<
сначала переадресация или перенаправление переменной вvenv/bin/activate
потомmain.py
.Для очень очевидного примера того, что здесь происходит и почему это работает, рассмотрим следующий скрипт sh
kitten.sh
:Он просто запускается
cat
, который начинает чтение со стандартного ввода и выводит его ввод в стандартный вывод.источник
/dev/stdin
есть файл устройства (или символическая ссылка на него), который будет выполнять правильные действия при чтении. Конечно, компромисс заключается в том, что переносимость ограничена операционными системами, чьи специальные имена вы знаете, например, назначением локальной переменной соответствующего поддельного имени файла и последующим использованием этой переменной в качестве аргументаpython main.py
.