Linux equivalente para «cmd / C start" Título "" C: \ Folder \ file.bat "»

0

Eu tenho um programa em Java que executa um arquivo em lotes no Windows com Runtime.getRuntime().exec() usando o seguinte comando:

cmd /C start "Title" "C:\Folder\file.bat"

O programa Java termina rapidamente, pois cmd /C executa o comando e, em seguida, finaliza (1) e start "Title" "C:\Folder\file.bat" inicia o script em lote (2) . Assim, o processo (o arquivo de lote) continuará sendo executado independentemente .

Agora, suponha que eu tenha um script de shell (por exemplo, file.sh ), que desejo lançar do Java e tenha um comportamento semelhante. Como poderia ser o comando equivalente (3) no Linux?

Notas

  1. Consulte CMD.exe (Command Shell) | Windows CMD | SS64.com
  2. Consulte Iniciar - Iniciar um programa | Windows CMD | SS64.com
  3. O título ( "Title" ) não é obrigatório.
por Paul Vargas 25.03.2015 / 06:13

4 respostas

5

A maneira de lançar um script é fornecer o caminho:

/path/to/script.sh

Para continuar, se o processo pai sair, basta iniciá-lo em segundo plano adicionando & :

/path/to/script.sh &

Então, se você tiver, por exemplo, um script chamando outro assim:

#!/bin/bash
script2.sh &

Você pode executar script1.sh , que chamará script2.sh e, como ele é enviado para segundo plano, saia imediatamente.

    
por terdon 25.03.2015 / 15:06
1

Você tem muitas opções, mais interessantes são estas:

  • Se for para o Ubuntu, você pode usar gnome-terminal :

    gnome-terminal -c "/home/$USER/file.sh" -t "Title"
    
  • Se você quer torná-lo compatível com a maioria dos linux, você pode usar xterm :

    xterm -T "Title" -e "/home/$USER/file.sh"
    

O caminho é /home/$USER/file.sh (equivalente ao Windows 7: C:\Users\%UserProfile%\file.bat )

O conteúdo de file.sh pode ser algo assim:

#!/bin/bash

echo "In a World without Walls nor Fences, the people don't need Windows and Gates"
sleep 2
    
por Helio 25.03.2015 / 09:13
1

Várias maneiras de executar um script no Linux: meu nome de script arbitrário é foo.bat

ex1: $bash foo.bat

ex2: $./foo.bat

ex3: $echo $(~/Desktop/foo.bat)

ex4: '~ / Desktop / foo.bat'

ex5: $ /path/to/shell/script/foo.bat

ex1: this is is just a regular file at this point, we execute it with bash
ex2: we have marked foo.bat as executable. ($chmod +x foo.bat)
ex3: Command substitution 
ex4: execute using "''"
ex5: we us the path to the executable.

Estes são os mais comuns. Eu evitaria chamar coisas como gnome-terminal e xterm. Estes são shells menos comuns em comparação com coisas como bash e sh. Por exemplo, eu uso o Ubuntu mate. Eu não tenho xterm nem gnome-terminal. Mas eu tenho bash e sh. como quase sempre outra pessoa executando o Linux / mac osx.

Você pode apreciar este tutorial sobre a execução de scripts aqui

o script foo.bat faz isso:

$ ./foo.bat
Having a bash ./foo.bat

onde seu conteúdo é:

$ cat foo.bat 
#!/bin/bash
echo -e "Having a bash" $0

Acho que o uso de $ 0 pode dar a você a funcionalidade de título que você pode desejar. Existem muitas outras possibilidades.

    
por j0h 25.03.2015 / 12:10
1

Pelo que entendi, você deseja executar um comando externo a partir de Java e continuar o processo Java (de forma assíncrona), enquanto esse comando externo continua a ser executado também?

Aqui está um pequeno teste que eu fiz:

[tai@flenux runproc ] $ ls
filecreator.sh  ProcRunner.class  ProcRunner.java

[tai@flenux runproc ] $ cat filecreator.sh 
touch newfile

[tai@flenux runproc ] $ cat ProcRunner.java 

public class ProcRunner {
    public static void main(String[] args) {
        try {
            Runtime.getRuntime().exec(args);
            Thread.sleep(2000);
            System.out.println("Done");
        } catch(Exception e) {
            System.err.println(e.toString() );
        }
    }
}

[tai@flenux runproc ] $ java ProcRunner bash filecreator.sh 
Done

[tai@flenux runproc ] $ ls
filecreator.sh  newfile  ProcRunner.class  ProcRunner.java

[tai@flenux runproc ] $ 

O Java executa com sucesso o programa (que simplesmente cria o arquivo "newfile"); ele também continua em seu próprio modo alegre de imprimir a mensagem Done depois de chamar o exec.

Se você quiser também abrir uma janela de terminal, prefixar a string de chamada

Runtime.getRuntime().exec(["gnome-terminal", "-e"]+args);

Então, para responder à sua pergunta, parece que você só chamaria o método especificado. Você está tendo um comportamento diferente?

    
por taifwa 06.04.2017 / 00:03