PID 6350을 사용하여 터미널 에뮬레이터(T1)를 연다고 가정해 보겠습니다.
다른 터미널(C1)에서 다음 명령을 입력합니다.
echo "ls\n" > /proc/6350/fd/0
그러면 ls
T1에 새 행이 기록되지만 실행되지는 않습니다. 왜?
cat|bash
나는 또한 with를 사용해 보았지만 echo "ls\n" > /proc/catid/fd/0
여전히 실행되지 않습니다.
명령을 다른 터미널에 에코하고 명령을 실행하려면 어떻게 해야 합니까?
가능한 답변:
$ mkfifo toto;
$ bash < toto;
$ echo "ls" > toto;
이 경우 더 이상 터미널에 직접 쓸 수 없습니다(모든 것은 명령(C1)이 해당 터미널에 표시하는 것과 동일한 방식으로 표시됩니다.
답변1
ttyecho
다른 터미널(tty/pts)에 명령을 보내고 해당 명령을 실행할 수 있는 명령줄 유틸리티가 있습니다 .
sudo ttyecho -n /dev/pts/5 ls
바라보다:명령이나 데이터를 다른 터미널로 보내는 유틸리티(tty/pts)
또한보십시오:ttyecho
github의 소스 코드.
또 다른 흥미로운 tty 명령은 selector
tty 입력 버퍼를 업데이트하는 콘솔의 실시간 대화형 패턴 일치자라는 것입니다.
# selector examples
selector -v -x @ <(find . -maxdepth 2 -type d | awk '{print $0"@cd "$0}')
selector -v -x @ <(grep -E -o 'http[^ ]+' fileWithURLS)
바라보다:선택기 - 콘솔의 동적 검색
답변2
/dev/pts/X
/proc/6350/fd/0
( , 1
해당 심볼릭 링크만 ) 에 쓰기를 실행하면 2
프로세스(또는 적절하게 분기된 하위 프로세스 중 하나)가 무언가를 출력할 때 발생하는 것과 정확히 동일합니다 6350
. 즉, 터미널에 씁니다.
당신이 시도한다면읽다그 장치( cat < /dev/pts/X
)에서 이상한 일이 일어날 것입니다. 원래 쉘에 입력한 내용이 표시되어야 합니다. (대부분 첫 번째 새 줄을 입력한 후에만 가능합니다. 터미널 프로그램( xterm
또는 사용 중인 프로그램)이 일부 줄 버퍼링을 수행하고 6350
차단된 쉘이 해당 부분을 가져오는 것 같습니다 read
. 그런 다음 쉘이 승리할 수도 있고 그렇지 않을 수도 있습니다. 후속 읽기이지만 이것에 대해서는 완전히 틀릴 수도 있습니다.)
문제는 장치에서 읽거나 쓸 때 장치를 사용하는 다른 쉘과 통신하지 않는다는 것입니다. 예를 들어 터미널 에뮬레이터와 대화하고 있습니다 xterm
. 터미널 에뮬레이터만이 이 채널에 데이터(셸에서 읽은 데이터)를 삽입할 수 있으며, 셸에서 작성한 모든 내용은 터미널로 전송됩니다. 두 번째 셸을 설치해도 이 내용은 변경되지 않습니다.
프로세스 에 명령을 삽입하려면 6530
터미널(X11 애플리케이션이든 다른 것이든)을 통해 수행해야 합니다.