2012-10-16 43 views
2

我希望这是一个大师的快速问题。 我有以下命令,在命令行的伟大工程:Bash重定向和stdin

src/protected/yiic shell src/index.php <<< createmvp < /dev/tty 

此命令执行的yiic bash脚本,并通过它的参数外壳和src/index.php文件。

第一个< < <将参数createmvp传递到当yiic shell src/index.php自己运行时显示的终端提示符。第二个<然后允许std in返回到应用程序。

然而,当我运行这个bash脚本

#!/bin/bash 
src/protected/yiic shell src/index.php <<< createmvp < /dev/tty 

内的脚本不通过createmvp入壳。 如果我删除了</dev/tty位传递createmvp的作品,但是然后夺回终端显然没有。我似乎没有做任何工作。

while(!isset($input)) 
{ 
    $input = trim(fgets(STDIN)); 
    if(!$input) 
     echo "$configVar can not be NULL"; 
} 

任何想法,如何使这项工作,因为它从命令行?

在此先感谢

艾伦

+0

我在linux现在我没有,但我认为你必须用引号传递2个第一个参数; src/protected/yiic“shell src/index.php”<<< createmvp

+0

即启动shell但将createmvp传递到应用程序中。感谢您花时间回复:) –

+0

如果您将输入重定向移动到行首,该怎么办? IIRC它是合法的,把它放在任何地方:::::::::::::' Wug

回答

1

我认为你应该使用eval:

#!/bin/bash 
cmd="src/protected/yiic shell src/index.php <<< createmvp < /dev/tty" 
eval $cmd 
+0

这会打开yiic shell,但不会将createmvp传递给它。感谢您花时间回复:) –

+0

因此,其中一个解决方案将createmvp传递到yiic shell中,另一个不会...写入错误或者我真的不明白您想实现的目标:P –

+0

所以yiic是程序,shell src/index.php是参数。 yiic打开一个接受用户输入的shell。通过执行<<< createmvp我可以将其传入shell并运行该命令。 createmvp运行一个php脚本,然后等待STDIN上的用户输入,但当命令通过bash脚本运行时,它始终为空。当从终端跑出来时,它完美地工作。 –

2

(echo createmvp; cat /dev/tty) | src/protected/yiic shell src/index.php

我认为,之所以<<< createmvp < /dev/tty不工作是因为这两个<<<<是指定标准来源的方法,您不能这样做都。 <<<将一个字符串作为参数并将其传递给stdin,而<接受一个文件。

1

要尽快退出脚本yiic处理exit命令本身,在退出一个trap可用于yiic子shell:

# small addition to cpugeniusmv's answer 
(echo createmvp; cat /dev/tty) | 
    (trap 'kill 0' EXIT; src/protected/yiic shell src/index.php)