나는 Unix 파일 시스템에 대해 배우고 있으며관로. ~에 따르면괴짜 중의 괴짜,
파이프는 두 번째 프로그램이 읽을 때까지 첫 번째 명령의 출력을 보유합니다.
그래서 할 수 있을까 생각했어요협회ㅏC 프로그램그리고자바 프로그램C 코드의 출력을 Java 코드에 대한 명령줄 인수로 제공합니다.
이것은 내 코드입니다.
CC
#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]);
}
}
C 개체 파일 실행 명령과 Java 클래스 실행 명령을 연결하여 다음과 같은 출력을 시도합니다.
Hello World
내가 시도한 것은 다음과 같습니다.
gcc -o c c.c
javac Java.java
./c | java Java
일이 예상대로 진행되지 않았습니다. Java 프로그램은 C 프로그램의 출력을 수신하지 않고 단지 예외를 발생시킵니다 ArrayIndexOutOfBounds
. 또한 C 프로그램의 출력도 볼 수 없습니다.
가능하다면 어떻게 목표를 달성할 수 있나요?
답변1
당신이 원하는 것은 가능하지만 시도만큼 쉽지는 않습니다. 올바르게 지적했듯이 파이프는 명령줄 인수가 아닌 입력을 제공합니다.
다행히도 이를 수행하는 (표준) 절차가 있습니다.xargs
GNU 세계(Linux)에서 가장 좋은 접근 방식은 출력 요소를 리터럴 0바이트로 분리하는 것입니다.
/your/c/program | xargs --no-run-if-empty -0 /your/java/program
다음을 사용해 쉽게 시도해 볼 수 있습니다 echo
(어쨌든 기본 명령입니다) xargs
.
echo '/bin
/etc
/usr' | xargs ls -ld
답변2
당신이 원하는 모든 것이 가능하고 쉽습니다. 그냥 입력하세요
/your/java/program "$(/your/c/program)"
이 $(…)
표기법을 "명령 대체"라고 합니다. 런타임은 출력을 파이프에 넣고 캡처하여 명령줄에 넣습니다. 그래서$(command1)
command1
명령 2$(명령 1)출력을 사용하여 명령줄 인수로 실행합니다. 출력(즉, C 프로그램)이 여러 단어(예: )인 경우를 처리하려면 따옴표( )를 추가해야 합니다. 그것이 당신이 요구하는 전부입니다.
command2
command1
"…"
command1
printf("planet earth");
이 문제에 대해 자세히 논의했습니다.여기, 여기서 예시를 보여드리겠습니다.
$ ls -ld "$(날짜"+%B %Y").txt" -rwxr-xr-x 1사용자 이름 그룹 이름 687화 2018년 4월 2일 11:09.txt
PS 매우 오래되었거나 특이한 시스템을 사용하는 경우 이 $(…)
기호가 작동하지 않을 수 있습니다. 이 경우에는 다음을 시도하십시오.
/your/java/program "`/your/c/program`"
`…`
이전 버전입니다 $(…)
. $(…)
시스템에 해당되는 경우 이를 사용하세요.