2012-10-16 111 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)