2011-11-05 16 views
4

我經常使用Ruby gem clean命令來保持本地gem存儲庫的形狀。如何爲Ruby「gem clean」命令默認[Yn]響應?

然而,由於依賴問題,很多時候該命令返回一個這樣的提示爲:

XXXXX-1.0.6 depends on [YYYYYY (~> 0.8.4)] 
If you remove this gems, one or more dependencies will not be met. 
Continue with Uninstall? [Yn] 

雖然這是非常簡單,它需要人工干預(用於[Yn]響應),因此這是阻止我創建一個簡單的cron腳本來自動執行此過程。

有關如何默認響應這些gem提示的任何想法?

回答

1

這應該工作:

echo|gem clean 

它會像打在迅速恢復。 'y'是默認值,它將運行gem clean完成。

+0

我剛測試過這個,它似乎沒有像預期的那樣。在我的環境中,我在這些情況下給寶石清潔一個「n」。所以,我跑了......「echo'n'| gem clean」,它將它視爲y並將其清理乾淨。 –

+0

你是對的 - 但是,它仍然有伎倆我猜。編輯更少誤導。 – Thilo

0

Thilo的答案是最簡單的。但是,如果您需要使用「n」,那麼您運氣不好。一些搜索發現這個線程與一些示例Java代碼:Java: Detecting user prompt when running a batch script from Java

我修改了一些這種情況,我認爲這會讓你更保守的選擇使用「n」作爲默認選擇。當然,如果您不希望在您的cron作業中運行java類,那麼可以將此代碼修改爲bash腳本 - 但我會將其留給更熟悉bash的人員。

我沒有簡單的方法來測試此代碼,所以讓我知道它的票價。 :)

public static void main(final String... args) throws IOException, InterruptedException { 
    final Runtime runtime = Runtime.getRuntime(); 
    final String command = "..."; // cmd.exe 
    final String matchString = "Continue with Uninstall? [Yn] "; 
    final String response = "n"; 

    final Process proc = runtime.exec(command, null, new File(".")); 

    final BufferedReader input = new BufferedReader(new InputStreamReader(proc.getInputStream())); 
    final BufferedWriter output = new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())); 

    StringBuilder sb = new StringBuilder(); 
    char[] cbuf = new char[100]; 
    while (input.read(cbuf) != -1) { 
     sb.append(cbuf); 
     if (sb.substring(sb.length() - matchString.length(), sb.length()).equals(matchString)) { 
      output.write(response); 
      output.newLine(); 
      output.flush(); 
     } 
    } 
    System.out.println(sb); 
} 
7

你應該有一個yes命令時,OSX版本有這樣一段話:

YES(1)     BSD General Commands Manual     YES(1) 

NAME 
    yes -- be repetitively affirmative 

SYNOPSIS 
    yes [expletive] 

DESCRIPTION 
    yes outputs expletive, or, by default, ``y'', forever. 

HISTORY 
    The yes command appeared in 4.0BSD. 

4th Berkeley Distribution  June 6, 1993  4th Berkeley Distribution 

因此,也許這將工作:

yes n | gem clean 

gem clean可能直接從被閱讀終端而不是標準輸入。在這種情況下,你可能有expect踢左右:

預計是「談判」,以其它交互式程序按照一個腳本程序。在腳本之後,預計知道程序可以預期什麼,以及正確的響應應該是什麼。解釋型語言提供分支和高層次的控制結構來指導對話。另外,用戶可以在需要時直接控制和交互,然後將控制權返回給腳本。

因此,您可以編寫一個expect腳本來根據需要以「y」或「n」響應預期的提示。