文字列を tty に入れてコマンドを設定します。

文字列を tty に入れてコマンドを設定します。

私はこれができました

エコ-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パスを使用してください。

答え4

編むvt.cを書く:gcc writevt.c -o writevt

その後、コマンドを送信してください./writevt /dev/ttyN 'ls -al^M'。 ^Mは、入力から得られた戻り文字を意味しますctrl-v ctrl-m

ネームパイプとscreen / tmuxも有効な方法です。ここもっと学ぶ。

関連情報