Pergunta

Eu gostaria de festa de invocação usando uma string como entrada. Algo como:

sh -l -c "./foo"

Eu gostaria de fazer isso a partir Java. Infelizmente, quando eu tentar chamar o comando usando getRuntime().exec, eu recebo o seguinte erro:

      foo": -c: line 0: unexpected EOF while looking for matching `"'

      foo": -c: line 1: syntax error: unexpected end of file

Parece estar relacionado com a minha cadeia não sendo encerrado com um EOF.

Existe uma maneira para inserir um EOF específica da plataforma para uma string Java? Ou devo estar à procura de uma outra abordagem, como a escrita de um script temporário antes de invocar "sh"?

Foi útil?

Solução

Use esta:

Runtime.getRuntime().exec(new String[] {"sh", "-l", "-c", "./foo"});

Principal ponto:.! Não colocar as aspas duplas em que só é usado quando se escreve uma linha de comando no shell

.

por exemplo, echo "Hello, world!" (como digitado no shell) é traduzido para:

Runtime.getRuntime().exec(new String[] {"echo", "Hello, world!"});

(Apenas esqueça por um momento que o shell normalmente tem um builtin para echo, e está chamando /bin/echo vez: -).)

Outras dicas

linhas de comando do Windows diferente do UNIX, Mac OS X e GNU / Linux.

No Windows o processo recebe o texto de entrada como é após o nome executeable (e espaço). É, em seguida, até o programa para analisar a linha de comando (que normalmente é feito implicitamente e o programador é muitas vezes sem noção).

Em GNU / Linux o shell processa a linha de comando e gnereates a matriz familiar de cordas passados ??para C do principal. Você não tem que shell. A melhor abordagem (mesmo no Windows) é usar a forma de exec onde você passa cada argumento de linha de comando individualmente em sua própria cadeia.

Você pode obter um shell para a análise para você, se você realmente queria. Que faria você exemplo olhar algo como (não testado):

Runtime.getRuntime().exec(new String[] {
    "sh", "-c", "sh -l -c \"echo foo; echo bar;\""
});

EOF não é um personagem, então não há nenhuma maneira de escrever um EOF. Você se esqueceu de fechar uma string.

A causa para este erro é mais provável uma sintaxe faltando token que espera festança, mas a corda você passar extremidades antes do bash encontrou-lo. Procure ifs, Fors etc. que não têm fi fechamento ou feito.

Cotações precisa ser escapado quando dentro de uma string. Em vez de escrever "write \".

por exemplo.

strcpy (c, "Esta é uma string \" "aspas" com \);

Se eu fosse você, eu iria escrever o conteúdo da string para um bashfile temporário e ver se executa festança que, sem qualquer erro. Se que executa sem um erro, então eu consideraria depuração ainda mais;

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top