Bash 4.X에서는 다음을 수행할 수 있습니다.
command that expects input &
echo some output | %1
%1은(는) 첫 번째 백그라운드 명령을 나타냅니까?
답변1
예, 하지만 조금 더 필요합니다.
프로그램을 백그라운드로 보내면 stdin
터미널과의 연결이 끊어집니다. 대체 입력(이 경우 파이프)으로 시작해야 합니다.
$ mkfifo alternate_input
$ command_that_expects_input < alternate_input
alternate_input
이제 파이프 파일( )을 stdin
프로세스의 파일 로 지정 했습니다 command_that_expects_input
. 입력을 보내려면 파이프에 무언가를 넣으면 됩니다.
$ echo foo > alternate_input
이 경우 문자열은 for foo
으로 전송됩니다 .stdin
command_that_expects_input
답변2
일단 시작하면:
rm -i -- * &
rm
명령이 호출될 때 쉘에 있던 stdin으로 시작되었습니다.
터미널인 경우 터미널 rm
에서 읽으려고 하면(터미널의 포그라운드 프로세스 그룹에 속하지 않기 때문에) 일반적으로 정지됩니다(SIGTTIN 신호 사용).
다른 것에서 읽으려면 다른 것에서 파일 설명자 0을 다시 열도록 지시해야 합니다.
디버거를 사용하여 이 작업을 수행할 수 있습니다(Linux를 사용한다고 가정합니다).
rm_pid=$!
coproc yes
gdb --pid="$rm_pid" --batch \
-ex "call close(0)" \
-ex "call open(\"/proc/$$/fd/$COPROC\", 0)" /bin/rm
kill -s CONT "$rm_pid"
위에서는 yes
배경부터 시작하여 표준 입력과 표준 출력을 파이프로 리디렉션합니다. 이 파이프의 다른 쪽 끝은 $$
파일 설명자 (일명) ${COPROC[0]}
의 셸(프로세스) 에 있습니다 $COPROC
.
그런 다음 를 사용하여 fd 0을 닫고 동일한 파이프에서 다시 열도록 gdb
지시합니다 .rm
답변3
귀하의 가정에 따르면 그렇지 않습니다. terdon이 말했듯이 입력을 먼저 파이프해야 한다는 것을 안다면 훨씬 쉽습니다. 프로그램에 지금은 입력이 필요하지 않지만 앞으로는 입력이 필요하게 되는 드문(그리고 저는 본 적이 없습니다) 경우 명명된 파이프를 프로세스에 대한 입력으로 설정하고 이를 백그라운드에 놓은 다음 보낼 수 있습니다. 동일한 Named Pipe로 나중에 프로세스가 시작되지만, Named Pipe를 미리 설정해야 합니다.