Pessoal, tenho o seguinte código para fazer do console do eclipse o próprio terminal do computador.
Para a maioria das coisas funciona perfeitamente.
public class TestBash {
public static void main(String[] args) throws IOException,
InterruptedException {
String[] cmdarray = { "bash" };
Process proc = Runtime.getRuntime().exec(cmdarray);
StreamGobbler errorGobbler = new StreamGobbler(proc.getErrorStream(),
System.err);
StreamGobbler outputGobbler = new StreamGobbler(proc.getInputStream(),
System.out);
StreamGobbler inputGobbler = new StreamGobbler(System.in,
proc.getOutputStream());
errorGobbler.start();
outputGobbler.start();
inputGobbler.start();
int exitVal = proc.waitFor();
errorGobbler.join();
outputGobbler.join();
System.exit(exitVal);
}
}
class StreamGobbler extends Thread {
InputStream is;
OutputStream os;
StreamGobbler(InputStream is, OutputStream os) {
this.is = is;
this.os = os;
}
public void run() {
try {
int c;
while ((c = is.read()) != -1) {
os.write(c);
os.flush();
}
} catch (IOException x) {
throw new RuntimeException(x);
}
}
}
São 3 Threads. Uma que fica escutando a entrada do teclado (System.in) e outras 2 que ficam escutando a saída.
Para comandos como ls, cp, cd está funcionando perfeitamente.
Eu tenho um programa (script) no computador, que quando eu executo [color=red]./programa[/color] ele mostra a página “help” do programa. Isso funciona perfeitamente via java e via terminal.
Porém ao executar executo [color=red]./programa -u user:pass[/color] ele deveria exibe uma mensagem de boas vinda e listar alguns comandos que aquele script pode realizar (/L, /S /C, etc).
Via terminal funciona perfeitamente, porém via console do java não.
No terminal a shell muda quando eu executo o programa (Exemplo)
[quote]MacBook-Pro pedrofialho$ ./programa -u user:pass
Welcome Pedro
Type /help for available commands
[waiting]:[/quote]
Então aparentemente está sendo gerado um processo filho dentro do processo no qual o InputStream não está conseguindo captar os dados.
Alguém tem alguma sugestão?
PS.: Se eu executar via console em vez de eclipse usando
javac MeuPrograma.java
java MeuPrograma
./programa -u user:pass
Ele fica parado aqui. Quando eu dou ctrl C para matar o processo, ele exibe as mensagens de boa vindas (que eu quero ver) antes de sair.