В скрипте bash используйте / dev / stdin для первого из нескольких вводов командной строки в завернутом скрипте - PullRequest
0 голосов
/ 20 февраля 2011

Допустим, я пишу скрипт bash myscript.bash, который ожидает один аргумент ($ 1). Одна из вещей, которую он делает, это вызывает wrapped.py, скрипт на python, который запрашивает у пользователя четыре ввода. Я хочу отправить $ 1 для первого из этих входов автоматически, а затем попросить пользователя сделать все остальное как обычно.

Как я могу это сделать? Я попытался echo $1 | wrapped.py < /dev/stdin, но это передает EOF для второго ввода, запрошенного wrapped.py, вызывая ошибку Python EOFError. Это работает, если я эхо-е "$ 1 \ na \ nb \ nc", то есть эхо всех четырех входов ... но я хочу, чтобы пользователю было предложено для других трех. Я мог бы написать полноценную оболочку для скрипта Python, но это создает проблемы с обслуживанием, поскольку обновление, например, wrapped.py может, например, добавить пятый вопрос.

Вот как выглядит фактическая ошибка:

$ echo 'test_app' | django-startproject.py test_app tmp < /dev/stdin
Project name [PROJECT]: Project author [Lincoln Loop]: Traceback (most recent call last):
  File "/usr/local/bin/django-startproject.py", line 7, in <module>
    execfile(__file__)
  File "/home/rich/src/ll-django-startproject/bin/django-startproject.py", line 9, in <module>
    main()
  File "/home/rich/src/ll-django-startproject/bin/django-startproject.py", line 5, in main
    start_project()
  File "/home/rich/src/ll-django-startproject/django_startproject/management.py", line 44, in start_project
    value = raw_input(prompt) or default
EOFError: EOF when reading a line

Ответы [ 2 ]

1 голос
/ 20 февраля 2011

Простой способ:

(echo "$1"; cat) | rest of the pipe here

Недостатком этого подхода является то, что остальная часть канала воспринимает входные данные как канал и имеет тенденцию терять большинство приятных "интерактивных" свойств.Опять же, это зависит от вашего сценария.

Для чего-то более причудливого, вы должны изучить expect.

0 голосов
/ 20 февраля 2011

Вы можете настроить что-то вроде этого:

Ваш скрипт bash

#!/bin/sh

./test.py $1

И скрипт Python

#!/usr/bin/python
import sys
print("In py script now")
for i in sys.argv:
print i

print raw_input('What day is it? ')
print raw_input('What date is it? ')
print raw_input('What month is it? ')

print ("Exiting py script")

И запускать так

./myscript.bash abc

Выход

In py script now
./test.py
abc
What day is it? 65
65
What date is it? 98
98
What month is it? 14
14
Exiting py script
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...