Fornece a saída do programa C como programa Java de entrada da linha de comandos?

1

Eu estava aprendendo sobre o sistema de arquivos Unix e aprendi sobre pipes . De acordo com GeeksForGeeks ,

A pipe holds the output of the first command till it has been read by the second program

Então, eu estava pensando se eu poderia linkar um programa C e um Programa Java para fornecer a saída do código C como os argumentos da linha de comando para o código Java.

Aqui estão os meus códigos:

c.c

#include <stdio.h>
int main(){
    printf("World");
    return 0;
}

Java.java

public class Java{
    public static void main(String[] a){
        System.out.println("Hello "+a[0]); 
    }
}

Eu tentei vincular o comando de execução do arquivo de objeto C e o comando de execução de classe Java para que a saída acabe sendo:

Hello World

Isso é o que eu tentei:

gcc -o c c.c
javac Java.java

./c | java Java

Não foi como eu esperava. O programa Java não recebeu a saída do programa C e simplesmente emitiu uma exceção ArrayIndexOutOfBounds . Além disso, não vi a saída do programa em C.

Como posso alcançar meu objetivo, se é que isso é possível?

    
por progyammer 08.04.2018 / 18:07

2 respostas

2

O que você quer é possível e fácil. Apenas digite

/your/java/program "$(/your/c/program)"

A notação $(…) é chamada de “substituição de comando”. %código% executa $(command1) com saída para um pipe captura-o e coloca-o na linha de comando. Então

command2 $(command1)
runs command1 com a saída de command2 como um argumento de linha de comando. Você deve adicionar aspas ( command1 ) para lidar com o caso onde a saída de "…" (ou seja, seu programa C) é de várias palavras (por exemplo, command1 ). Isso é o que você está pedindo.

Eu discuto isso em alguma extensão aqui , onde mostro o exemplo

$ ls -ld "$(date "+%B %Y").txt"
-rwxr-xr-x  1 username groupname    687 Apr  2 11:09 April 2018.txt

P.S. Se você está em um sistema muito antigo ou incomum, a notação printf("planet earth"); pode não funcionar. Nesse caso, tente

/your/java/program "'/your/c/program'"

$(…) é uma versão antiga de '…' . Se $(…) funcionar no seu sistema, use-o.

    
por 09.04.2018 / 04:32
2

O que você quer é possível, mas não tão fácil quanto você tentou. Como você afirmou corretamente, um pipeline fornece entrada, e não argumentos de linha de comando.

Por sorte, há um programa (padrão) que faz exatamente isso: xargs

No mundo GNU (Linux), a melhor maneira seria separar os elementos de saída com bytes zero literais:

/your/c/program | xargs --no-run-if-empty -0 /your/java/program

Você pode facilmente tentar isso com echo (que é o comando padrão para xargs anyway ':

echo '/bin
/etc
/usr' | xargs ls -ld
    
por 08.04.2018 / 18:40