Supposons que vous ayez un émulateur de terminal (T1) ouvert avec un PID de 6350.
Depuis un autre terminal, tapez cette commande (C1):
echo "ls\n" > /proc/6350/fd/0
Cela écrit ls
et la nouvelle ligne en T1 mais ne l'exécute pas. Pourquoi?
J'ai également essayé d'utiliser cat|bash
avec echo "ls\n" > /proc/catid/fd/0
mais il n'est toujours pas exécuté.
Comment puis-je répercuter la commande dans un autre terminal et la faire exécuter?
réponse possible:
$ mkfifo toto;
$ bash < toto;
$ echo "ls" > toto;
Dans ce cas, vous ne pouvez plus écrire directement dans le terminal (tout est affiché de la même manière que la commande (C1) affiché dans ce terminal.
terminal
stdout
command
file-descriptors
rvlander
la source
la source
Réponses:
Il existe un utilitaire de ligne de commande appelé
ttyecho
qui peut envoyer une commande à un autre terminal (tty / pts) et exécuter la commande.Voir: Utilitaire pour envoyer des commandes ou des données à d'autres terminaux (tty / pts)
Voir aussi:
ttyecho
code source sur github .Une autre commande tty intéressante est
selector
un matcher interactif en temps réel dans la console qui met à jour le tampon d'entrée tty.Voir: sélecteur - RECHERCHE DYNAMIQUE EN CONSOLE
la source
ttyecho
le code source sur github semble être rompu. Cependant, il semble être disponible à la place sur github.com/osospeed/ttyecho .Lorsque vous émettez une écriture vers
/dev/pts/X
(/proc/6350/fd/0
,1
et2
n'est qu'un lien symbolique vers cela), ce qui se passe est exactement la même chose que lorsque le processus6350
(ou l'un de ses enfants, convenablement bifurqué) sort quelque chose: il écrit sur le terminal.Si vous essayez de lire à partir de cet appareil (
cat < /dev/pts/X
), des choses géniales se produiront. Vous devriez voir apparaître les choses que vous tapez dans le shell d'origine. (Très probablement seulement après la première nouvelle ligne que vous avez tapée - je suppose que le programme terminal (xterm
ou tout ce que vous utilisez) fait un tampon de ligne, et le6350
shell qui a été bloquéread
obtient ce morceau; alors soit le shell pourrait, soit pourrait non, gagnez les lectures suivantes, mais je peux très bien me tromper sur ce point.)Le truc, c'est que lorsque vous lisez ou écrivez sur cet appareil, vous ne parlez pas à l'autre shell qui l'utilise. Vous parlez à l'émulateur de terminal (
xterm
par exemple). Seul l'émulateur de terminal peut injecter des données dans ce canal (ce que le shell lit), et tout ce que le shell écrit va au terminal. Attacher un deuxième shell ne change rien à cela.Si vous souhaitez injecter des commandes dans ce
6530
processus, il devra le faire via le terminal (que ce soit une application X11 ou autre).Lecture recommandée: Quelle est la différence exacte entre un «terminal», un «shell», un «tty» et une «console»?
la source
cat /dev/pts/x
, vous n'avez pas besoin<
), je reçois les lettres en alternance stricte entre les terminaux./proc/6350/fd/0
est de même pour un lien symbolique vers le parent stdin,process 6350
qui est un terminal. Je suppose que c'est la même chose pour les applications fenêtrées?