在bash脚本中,对包装脚本中的多个命令行输入中的第一个使用/ dev / stdin

时间:2011-02-19 23:55:27

标签: bash stdin

假设我正在编写一个bash脚本myscript.bash,它需要一个参数($ 1)。它所做的一件事就是调用wrapped.py这个python脚本,它会提示用户输入四个输入。我想自动为这些输入中的第一个提交1美元,然后让用户正常提示其余输入。

我该怎么做?我尝试echo $1 | wrapped.py < /dev/stdin,但是这会为wrapped.py请求的第二个输入提交EOF,从而导致Python EOFError。如果我回显-e“$ 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 个答案:

答案 0 :(得分:1)

简单方法:

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

这种方法的缺点是管道的其余部分将输入视为管道,并且往往会丢失大多数漂亮的“交互”属性。然后,这取决于你的脚本。

对于任何更有趣的东西,你应该研究expect

答案 1 :(得分:0)

您可以设置以下内容:

您的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