Executar script (não somente comando) de Linux no Java

Olá pessoal!

Então, no diretório /home/ do meu Ubuntu, possuo um script chamado a.sh, cujo conteúdo é apenas cp $1 $2. Ou seja, copiar o (arquivo) primeiro argumento para o (arquivo) segundo argumento.

Gostaria de saber como fazê-lo executar em Java de forma correta, via .jar. Eis o código do meu programa Java:

package pacote;

import java.io.IOException;

public class Script {
	public static void main(String args[]) {
		System.out.println("\tScript criado em Java.");
		System.out.println("\tIniciando processo.");
		Runtime run = Runtime.getRuntime();
		if (args.length != 2) {
			System.out.println("\t\tÉ necessário informar o nome do arquivo de origem e o nome do arquivo de destino.");
			System.exit(0);
		} else {
			try {
				System.out.println("\tExecutando comando.");
				String command = "./a.sh " + args[0] + " " + args[1];
				System.out.println("\tComando: " + command);
				run.exec(command);
				System.out.println("\tProcesso finalizado.");
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

Ao gerar o .jar deste projeto Java, e executá-lo: java -jar script.jar a.txt b.txt, ele “funciona”, pois imprime todas as mensagens na tela. Porém, o script em si não funciona. Ou seja, o arquivo b.txt não é gerado.

Gostaria de saber:

  1. O que devo modificar no código para que este script funcione.
  2. Se esse .jar rodaria no Windows sem problemas.

Ninguém sabe?

Acho que o Runtime não está encontrando o a.sh.

E se colocar para executar “/home/usuario/a.sh”, sendo que ele não está no mesmo diretório de execução?

http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/Runtime.html

Você pode usar:

Process	exec(String command, String[] envp, File dir) 

run.exec(command, null, "/home/usuario")

Para executar usando como base o seu diretório “home”.

[quote=graffiti75]
2) Se esse .jar rodaria no Windows sem problemas.[/quote]

Se você mudasse esse .sh pra um .bat, funcionaria sim.

Olá Bruno.

Não funcionou.

Vou tentar mapear todo o código do .sh para Java. Parece que o Java entende comandos do Linux, mas scripts .sh, não. Então, o que terei que fazer, creio eu, é reescrever todo o script em Java, chamando o Runtime apenas para comandos Linux como cut -d e echo.

O que eu queria era executar um comando como o abaixo, através do Java:

mp3cut -o out.mp3 -t 00:03:50;00:05:11 in.mp3

O comando mp3cut divide a música in.mp3 em várias músicas. Neste caso, apenas na música out.mp3. A divisão é feita de acordo com o argumento -t, que recebe o ínicio e o fim do trecho que será extraído da música original.

Tentei executar este comando no Java, mas não consegui.

Pessoal, através do código abaixo, estou gerando um arquivo .jar chamado mp3cut.jar.

package pacote;

import java.io.IOException;

public class Mp3Cut {
	public static void main(String args[]) throws InterruptedException {
		System.out.println("\tIniciando script.");
		Process p;
		if (args.length != 1) {
			System.out.println("\tUso: java -jar mp3cut.jar entrada.mp3");
			System.exit(0);
		} else {
			try {
				System.out.println("\tExecutando comando.");
				String command = "mp3cut -o saida.mp3 -t 00:01:50;00:02:11 " + args[0];
				p = Runtime.getRuntime().exec(command);
				Integer i = p.waitFor();
				System.out.println("\tComando executado (com status " + i + "): " + command);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

Porém, o comando não é executado.

Será que alguém sabe me dizer por que?

Ninguém sabe?

Será que só posso rodar no Linux um jar que gero no Linux?

tenta

String command = “mp3cut”,"-o",“saida.mp3”,"-t",“00:01:50;00:02:11” + args[0];

se ainda não conseguiu

Com você funcionou?