私はこれができました
エコ-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
端末は、入力デバイス(キーボードなど)とディスプレイデバイス(モニタなど)の2つの役割を果たします。端末から読むと、入力デバイスから出てくる内容が得られます。端末に書き込むと、データが表示装置に表示されます。
端末に強制的に入力する普遍的な方法はありません。これはほとんど必要ありません。端末が必要なプログラムと対話する必要がある場合は、専用の端末エミュレータを使用してください。予想されるまたは空または、次のプログラマブル端末ラッパー画面またはマルチプレクサ。 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パスを使用してください。