Puncte:0

Cum să rulați o comandă într-un terminal deschis anterior cu comanda gnome-terminal într-un script shell?

drapel cn

Vreau să rulez un cod sursă care are nevoie de patru terminale A, B, C și D. Există câteva comenzi pentru codul sursă care rulează în Ubuntu. Aceste comenzi trebuie să fie executate în ordine în terminale A, B, C, D, A, B și C. Într-adevăr, aceste comenzi sunt interconectate și trebuie executate în această ordine specifică.

Vreau să rulez automat codul sursă cu scripting shell. Am scris deja un script shell care deschide mai multe terminale cu gnome-terminal și funcționează bine până acum:

gnome-terminal --title="A" -- bash -c "cd ~; ./myscript1; exec bash"
gnome-terminal --title="B" -- bash -c "cd ~; ./myscript2; exec bash"
gnome-terminal --title="C" -- bash -c "cd ~; ./myscript3; exec bash"
gnome-terminal --title="D" -- bash -c "cd ~; ./myscript4; exec bash"

Acum vreau să mă întorc la terminal A și rulați o altă comandă în cadrul acesteia.

Următoarea declarație nu funcționează bine, deschide un nou terminal!

gnome-terminal --title="A" -- bash -c "cd ~; comandă; exec bash"

Nu am înțeles cum să fac asta după ce am citit paginile de manual ale terminalului Gnome și am căutat pe web.

Doug Smythies avatar
drapel gn
Ați putea transmite un token de la myscript3 la myscript1, să zicem printr-o conductă numită. După ce a făcut orice altceva, myscript1 ar aștepta jetonul și myscript3 l-ar trimite doar la momentul potrivit.
sudodus avatar
drapel jp
De asemenea, se poate comunica prin existența unui fișier.
N. S. avatar
drapel cn
@sudodus. La ce dosar te referi?!
sudodus avatar
drapel jp
Puteți lăsa procesul dintr-o fereastră de terminal să creeze un fișier și să-l verifice în mod repetat, iar un proces dintr-o altă fereastră să îl elimine, când este gata. Sau invers: lăsați procesul dintr-o fereastră de terminal să aștepte până când există un fișier și lăsați un proces dintr-o altă fereastră să creeze acel fișier, când este gata.Numele fișierului poate fi un fișier temporar (sau un set de fișiere temporare), iar numele (numele) poate fi controlat de un shellscript principal, care inițiază procesele în cele patru ferestre ale terminalului. - Un astfel de fișier poate fi gol sau poate conține un mesaj.
N. S. avatar
drapel cn
Am creat 2 script-uri bash „A” și „B” și un script „run” care rulează „A” și „B” în paralel. Conținutul „run” este: bash ./A & bash ./B & wait. Aștept în „A” crearea unui fișier cu o instrucțiune „while”, iar în „B” creez acel fișier, dar nu sunt executate comenzi de la „A”.
raj avatar
drapel cn
raj
Trebuie să existe 4 ferestre separate `gnome-terminal`? Sau poate exista o singură fereastră cu 4 sesiuni de terminale separate, comutabile? Pentru că în acest din urmă caz ​​puteți folosi un script `expect` combinat cu `screen` (unde începeți 4 sesiuni în `screen`) pentru a obține comportamentul dorit.
Puncte:2
drapel cn

Nu poți, cu excepția poate într-un mod hackish folosind simularea apăsării tastelor. de exemplu. xdotool pentru a reveni la prima fereastră, apoi lipiți câteva comenzi.

S-ar putea să existe modalități mai bune de a face ceea ce vrei. Cu toate acestea, pentru a putea oferi sugestii mai bune, trebuie să știm ce vrei cu adevărat să obții.

N. S. avatar
drapel cn
Mi-am editat întrebarea și am adăugat explicații suplimentare. Mulțumesc că ai aruncat o privire...
Puncte:1
drapel jp

Încercați cu următoarea demo care rulează A și B

A maestru scriptul creează un fișier temporar (în /tmp) și începe Un script și b-script în xterm ferestre.

Instalare

sudo apt install xterm

Puneți toate scripturile într-un director dedicat, faceți-le executabile și rulați

./maestru

maestru:

#!/bin/bash

ecou „$0 start”

b4a=$(mktemp)

nohup xterm -fa default -e ./a-script „$b4a” 2> /dev/null &
nohup xterm -fa default -e ./b-script „$b4a” 2> /dev/null &

dacă testul -f "$b4a"
atunci
 rm „$b4a”
fi
ecou „$0 terminare”

Un script:

#!/bin/bash

ecou „$0 start”
echo „$0 poate face lucruri aici...”
in timp ce ! test -f „$1”
do
 somn 1
 echo -n "."
Terminat
ecou ""
echo „$0 poate face lucruri aici...”
rm „$1”
citește -p "$0: Apăsați enter pentru a termina "

b-script:

#!/bin/bash

ecou „$0 start”
echo „$0 poate face lucruri aici...”
somn 5
atingeți „$1”
citește -p "$0: Apăsați enter pentru a termina "
N. S. avatar
drapel cn
Multumesc pentru raspunsul tau. Am scris deja aceste scripturi, dar cred că problema este legată de containerele mele docker! Într-adevăr, rulez două containere în a-script și b-script și după aceea vreau să rulez câteva comenzi în aceste containere. Când scriu unele comenzi în a-script după bucla while, acele comenzi nu se vor executa în containerul corespunzător.
sudodus avatar
drapel jp
De ce rulați două containere în a-script și b-script? Și de ce folosești patru ferestre terminale? -- Probabil că este posibil să configurați structura sarcinii într-un mod mai simplu, care va face munca cu mai puține probleme. Dacă ne spui nouă (sau doar mie, dacă nu vrei să faci publică sarcina), poți obține ajutor cu structura.
N. S. avatar
drapel cn
Cum să-ți spun doar ție? Multumesc pentru ajutor
sudodus avatar
drapel jp
@N.S. Puteți obține un ID de utilizator la [Ubuntu Forums](https://ubuntuforums.org) și puteți comunica prin intermediul mesajelor Ubuntu Forums (ID-ul meu de utilizator este și „sudodus” acolo).
N. S. avatar
drapel cn
Îmi pare atât de rău. Nu știu cum să comunic cu tine prin forumurile Ubuntu! :(

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.