백그라운드에서 프로세스를 실행하고 입력 및 출력을 리디렉션하는 방법이 있습니까? Java 스캐너를 사용하고 System.in을 입력으로 추가하는 Java 프로그램이 있습니다. 그래서 파일에서 읽도록 std 입력을 리디렉션하고 싶습니다. 우선 이것이 가능한지 잘 모르겠습니다. 다음은 작동하지 않습니다:
$: java Bagels << in.txt &
그냥 중단됩니다.
또한 동시에 실행되는 다른 프로그램에서 사용할 수 있도록 프로그램의 출력을 다른 파일에 쓰고 싶습니다. 이상적으로는 다음과 같습니다.
$: java Bagels << in.txt & >> out.txt &
$: python player.py << out.txt & >> in.txt &
답변1
첫 번째 예는 다음과 같이 시작해야 합니다.
java Bagels < in.txt
작성된대로 이것은 다음 Bagels
과 같이 실행됩니다.표준 입력파일 in.txt
1에서. 뒤에 앰퍼샌드를 추가하면 &
프로그램이 백그라운드에서 실행되어 더 많은 명령을 입력할 수 있도록 터미널의 명령 프롬프트가 준비됩니다.
in.txt
나는 두 번째 예가 이와 같을 것이라고 생각하지만 out.txt
일반적으로 한 프로그램의 출력을 다른 프로그램의 입력에 공급하고 두 번째 프로그램의 출력을 첫 번째 프로그램의 입력에 공급하는 것은 약간 혼란 스럽습니다. 좋은 생각.
java Bagels < in.txt | player.py > out.txt
그 기능은 in.txt
다음에 추가하는 것입니다.표준 입력Java 프로그램( <
파일에서), 해당 프로그램을 추가합니다.표준 출력출력 대상표준 입력입력 player.py
하고 쓰세요표준 출력Python 프로그램을 파일로 출력합니다 out.txt
( >
TO 파일이 쓰기 전용 모드에서 잘리거나, >>
추가로 대체되거나, 1<>
잘리지 않고 읽기+쓰기 모드로 열림).
마지막으로 첫 번째 문장에 썼던 질문에 답해주세요."백그라운드에서 프로세스를 실행하고 입력 및 출력을 리디렉션하는 방법이 있습니까?", 이렇게 모아놓으면 돼.
java Bagels < in.txt > out.txt &
¹ 여기에서 읽기 전용 모드로 열려면 <>
또는 0<>
ksh93으로 대체하여 읽기+쓰기 모드로 엽니다. 그러나 실제로 stdin을 읽기+쓰기 모드로 열어야 하는 경우는 극히 드뭅니다.
답변2
간단하게 하기 위해 "cat" 명령을 사용하는 예를 들겠습니다. ("cat"은 입력을 읽고 쓰기만 합니다.) "cat < input"을 입력하면 cat 명령은 "input" 파일에서 가져옵니다. 그러나 "cat << end_of_input"을 입력하면 (여기에 설명되어 있음) "end_of_input" 줄을 쓸 때까지 쉘이 (키보드에서) 입력한 모든 입력 줄을 읽습니다(ctrl_d는 대부분의 경우 작동함). 경우에도 마찬가지임) 그런 다음 cat 명령은 사용자가 제공한 입력으로 실행됩니다(물론 end_of_input 행 제외). 이것이 바로 사용자가 입력을 입력하기를 기다리고 있기 때문에 정지되는 이유입니다.
표준 입력을 리디렉션하는 경우 명령 출력을 파일로 리디렉션하려면 "command < input_file"을 작성하면 됩니다. 두 가지 옵션이 있습니다.
1- "cmd > 출력"(">"는 하나만 있음), 이 경우 이름이 "output"인 파일이 이미 존재하는 경우 명령 출력으로 덮어쓰게 됩니다.
2- "cmd>>output"(두 개의 ">>" 참고): "output" 파일이 존재하는 경우 명령의 출력을 해당 파일에 추가합니다. 명령이 이전 명령의 출력에서 입력을 받도록 하는 방법에 대해서는 "파이핑"을 사용할 수 있습니다.
간단한 예를 들어보겠습니다: "ls | cat", 이는 "ls" 명령의 출력을 "cat" 명령의 입력으로 리디렉션합니다. (프로세스가 백그라운드에서 실행될 수 있다면 프로세스가 백그라운드에서 실행되고 있다는 사실은 부적합합니다.)
이것이 도움이 되기를 바라며 행운을 빕니다.