나는 이것을 할 수 있었다
에코 -n"주문하다> /dev/tty1
문자가 나타나고 커서가 움직이지만 "유령"입니다. 을 클릭하면 Enter아무 일도 일어나지 않습니다(표준 입력이 아닙니다).
편집하다:
아래 스크린샷 중간에서 제가 그 용도를 본 이유를 알 수 있습니다. (빨간색 머리글이 있는 행은 노란색 머리글이 있는 행 바로 아래에 있습니다.) 이제 실제로 주석 텍스트를 "편집"하는 것이 아닙니다. (실제로는 아님) 편집 중인 주석 텍스트를 대체할 새 텍스트를 작성하라는 메시지가 표시됩니다. 그래서 저는 이전 텍스트를 tty에 붙여넣기만 하면 이 문제가 해결될 수 있다고 생각했습니다. 사용자가 Enter 키를 누르면 수정이 이루어지지 않습니다. (이 프로그램은 Perl/MySQL로 작성되었지만 "Perl에서 어떻게 해야 하나요?"보다는 일반적인 해결책을 묻는 것이 더 흥미롭다고 생각합니다.)
편집 2:
다음은 아래 C 코드(예상대로 정확하게 작동함)를 사용하는 Perl 코드와 새로운 스크린샷입니다. 이를 통해 상황이 명확해지기를 바랍니다 :) 다시 스크린샷 중간 부분에서 주석이 편집된 부분을 살펴보세요. text - this 다시 한 번 말하지만, 이전 텍스트가 있으므로 예를 들어 철자 오류만 수정하려는 경우 전체 노트 텍스트를 다시 입력할 필요가 없습니다.
my $edit_note_text = $edit_note_data[2];
print BOLD, RED, " new text: ", RESET;
system("writevt /dev/tty \"$edit_note_text\"");
my $new_text = <$in>;
$new_text = fix_input($new_text);
my $set_text = "UPDATE notes SET note = \"$new_text\" WHERE id = $edit_note_id";
$db->do($set_text);
답변1
터미널은 입력 장치(예: 키보드)와 디스플레이 장치(예: 모니터)의 두 가지 역할을 합니다. 터미널에서 읽으면 입력 장치에서 나오는 내용을 얻게 됩니다. 터미널에 쓰면 데이터가 디스플레이 장치에 표시됩니다.
터미널에 강제로 입력하는 보편적인 방법은 없습니다. 이는 거의 필요하지 않습니다. 터미널이 필요한 프로그램과 상호 작용해야 하는 경우 전용 터미널 에뮬레이터를 사용하십시오.예상되는또는비어 있는또는 다음과 같은 프로그래밍 가능한 터미널 래퍼화면또는멀티플렉서. Linux 콘솔에 강제로 입력할 수 있습니다.ioctl 사용. 터미널 에뮬레이터를 사용하여 X11 입력을 강제할 수 있습니다.xdo 도구또는매크로.
답변2
최소한 Linux 및 BSD에는 문자를 터미널 입력 버퍼로 다시 푸시하는 TIOCSTI ioctl이 있습니다(Linux에서는 최대 4096자 제한).
#include <sys/ioctl.h>
#include <termios.h>
#include <stdio.h>
#include <stdlib.h>
void stackchar(char c)
{
if (ioctl(0, TIOCSTI, &c) < 0) {
perror("ioctl");
exit(1);
}
}
int main(int argc, char *argv[])
{
int i, j;
char c;
for (i = 1; i < argc; i++) {
if (i > 1) stackchar(' ');
for (j=0; (c = argv[i][j]); j++) {
stackchar(c);
}
}
exit(0);
}
컴파일하고 이름을 지정합니다.
cmd foo bar < "$some_tty"
일부 tty에 문자를 다시 푸시합니다.
펄에서는:
require "sys/ioctl.ph";
ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV;
편집하다:이제 나는 그것이 동일한 ioctl이라는 것을 깨달았습니다.파일 쓰기해결책. TIOCSTI는 VT뿐만 아니라 모든 터미널에서 작동하기 때문에 명령의 설명과 이름은 오해의 소지가 있습니다.
답변3
나는Stack Overflow에서 더 완전한 데모를 볼 수 있습니다..
Python에서는 다음과 같이 할 수 있습니다.
import fcntl
import sys
import termios
with open('/dev/tty1', 'w') as fd:
for char in "ls -la\n":
fcntl.ioctl(fd, termios.TIOCSTI, char)
간단한 "command"
값을 가정 ls -la
하고 OP에 지정된 tty 경로를 사용하십시오.