DA: Există o modalitate de a spune unui program x care rulează deja să deschidă un fișier din bash!
Deci, în urma unui sfat de la oamenii de asistență tehnică ai StataCorp, se dovedește că xdotool
(care poate fi instalat cu sudo apt install xdotool
, dacă nu este deja pe sistemul dvs.) oferă o soluție exact la tipul de problemă din întrebarea mea. De pe site-ul proiectului:
xdotool
vă permite să simulați intrarea de la tastatură și activitatea mouse-ului, să mutați și să redimensionați ferestrele etc.Face acest lucru folosind extensia XTEST X11 și alte funcții Xlib.
â ï¸ Notă: Dacă utilizați Wayland, rețineți că acest software nu va funcționa corect. â ï¸
Cu xdotool
, puteți căuta ferestre și puteți muta, redimensiona, ascunde și modifica proprietățile ferestrei, cum ar fi titlul. Dacă managerul dvs. de ferestre îl acceptă, puteți utiliza xdotool
pentru a schimba desktop-uri, a muta ferestrele între desktop-uri și a schimba numărul de desktop-uri.
Pentru a-mi rezolva problema cu xdotool
, trebuia să creez un xdotool
script pe care îl sun statadoc.xdo
:
#!/usr/bin/xdotool
căutare --nume „Stata/MP”
tip --window %1 „$1” „$2”
key --window %1 Return
Câteva comentarii despre acest scurt scenariu:
- Calea poate fi altceva decât
/usr/bin/xdotool
, așa că asigurați-vă că confirmați asta cu care xdotool
sau asemănător.
- A doua linie se va potrivi parțial cu numele
„Stata/MP 17.0”
cu sfoara furnizata mai sus. Acest lucru este util, astfel încât, de exemplu, actualizarea versiunii la 17.1 sau 18.x să nu rupă scriptul. The căutare
comanda identifică fereastra aplicației X cu care vreau să interfațez.
xdotool
scripturile acceptă argumente, urmând bash
-ca $1
, $2
, etc convenţii.
- The
tip
comanda tasta literalmente textul furnizatâîn cazul meu, conținutul celor două furnizate $1
și $2
argumente șir în prima fereastră (și numai în cazul meu) identificată de căutare
comandă pe linia 2.
- The
cheie
comanda trimite un <ENTER>
(sau <RETURN>
dacă preferați) la aceeași fereastră Stata.
Acum să ne uităm la scriptul meu de lansare modificat, care apelează statadoc.xdo
în a treia până la ultima linie (am adăugat o secțiune în față pentru a recunoaște dacă argumentul furnizat indică anumite tipuri de fișiere Stata... sunt necesare comenzi de utilizare diferite pentru a gestiona cu grație fiecare... exemplul meu nu este complet, dar acestea sunt tipurile de fișiere Folosesc în majoritatea lucrărilor mele):
# Verificați dacă NU ESTE un argument. Dacă nu, nu faceți nimic.
dacă [ -z „$1” ]
atunci
pauză
# În caz contrar, setați prefixul la valoarea implicită, apoi verificați
# dacă numele fișierului se termină în .hlp, .sthlp, .ado, .do sau .gph
altfel
prefix="folosește"
dacă [ ${1##*.} = „hlp” ] || [ ${1##*.} = „sthlp” ] || [ ${1##*.} = „ado” ] || [ ${1##*.} = „face” ]
atunci
# Dacă numele fișierului SE termină cu unul dintre aceste patru prefixe, atunci
# schimba prefixul în „doedit”, astfel încât Stata deschide documentul cu
# editorul do-file.
prefix="doedit"
fi
# Dacă numele fișierului se termină în .gph, atunci schimbați prefixul în „doedit”, deci
# Stata deschide documentul cu vizualizatorul/editorul de grafice.
dacă [ ${1##*.} = „gph” ]
atunci
prefix="folosirea graficului"
fi
pauză
fi
# Verificați dacă xstata-mp v17 rulează
exit_code_pidof_xstata_mp=$(pidof /usr/local/stata17/xstata-mp)
# dacă xstata-mp v17 NU rulează, atunci lansați-l cu argumentul $1
dacă [ -z "$exit_code_pidof_xstata_mp" ]
atunci
/usr/local/stata17/xstata-mp -q $1; ieșire >/dev/null
# dar dacă xstata-mp v17 rulează, atunci aduceți-l în față
altfel
# Mai întâi, apelați statadoc.xdo cu prefixul ca prim argument,
# și calea fișierului furnizată ca al doilea argument
/usr/share/stata17/bin/statadoc.xdo „$prefix” „$1”
wmctrl -ia "$(wmctrl -lp | grep "$(pgrep /usr/local/stata17/xstata-mp)" | tail -1 | awk '{ print $1 }')"; ieșire > /dev/null
fi
Notă: Aceasta este o soluție pentru Gnome care rulează pe Xorg.