Anunţ

Caută printre mesajele de pe forum înainte de a scrie unul nou!
Formulează corect întrebarea sau problema pe care o ai.
Respectă regulile forumului și Codul de Conduită!

#1 18 Feb 2012 00:38:03

RazTaz
Membru
Locaţie: Bruxelles
Înregistrat: 17 Jan 2011
Mesaje: 853

variabile multiple din output de comanda - spre fisiere multiple

Salutare tuturor.
Am nevoie de o mana de ajutor de la acei dintre voi care sint mai priceputi.  Pe scurt.
Am un Thinkpad 220t (tableta/laptop), care suporta mai multe tipuri de input-uri (touchscreen, stylus, lenovo pen eraser, etc). Toate acestea merg cu driverul wacom. Problema este ca atunci cind rotesc ecranul, nu se rotesc automat si axele pentru stylus, touchscreen si pen eraser. Ca atare, am urmat (cu succese remarcabile) tutorialul de aici.

Output-ul comenzii

Cod:

xsetwacom --list devices

apare cam asa:

Cod:

Wacom ISDv4 E6 Finger touch         id: 13    type: TOUCH     
Wacom ISDv4 E6 Pen stylus           id: 14    type: STYLUS    
Wacom ISDv4 E6 Pen eraser           id: 15    type: ERASER

Insa la fiecare restartare, id-ul fiecarui device se schimba si, ca urmare, ca sa pot folosi input-deviceurile in modul tableta, trebuie sa reeditez de fiecare data 4 fisiere pe care le am in /usr/bin/  (rotatenormal, rotateleft, rotateright si rotateinverted).

De exemplu, fisierul /usr/bin/rotateleft are urmatorul continut:

Cod:

xrandr -o left
xsetwacom set 13 Rotate ccw
xsetwacom set 14 Rotate ccw
sudo setkeycodes  0x71 106 0x6f 105 0x6e 103 0x6d 108

unde 13 si 14 sint id-urile touchscreen-ului si - respectiv - stylus-ului.

Data viitoare cand voi restarta calculatorul, este posibil ca aceste id-uri sa fie asignate diferit. De exemplu, stylus-ul sa aibe id 16 si touchscrenul sa aibe id 15.

Am nevoie de ajutorul vostru in a scrie un mic script, care sa ia id-urile celor doua device-uri din outputul comenzii

Cod:

xsetwacom --list devices

si sa le scrie intr-un fisier din /usr/bin (gen rotateleft de mai sus), in pozitia corespunzatoare.

Va multumesc mult.

Razvan

Editat ultima oară de RazTaz (18 Feb 2012 11:08:48)


SISTEM:
Ubuntu 14.04 running on Lenovo Thinkpad x220t tablet/convertible.

Offline

 

#2 18 Feb 2012 08:01:46

Viorel.Dorel
Membru
Înregistrat: 20 Oct 2007
Mesaje: 149

Re: variabile multiple din output de comanda - spre fisiere multiple

Cod:

#! /bin/bash
eval $(xsetwacom --list devices | awk '
/[\t ]id:/    {
    gsub(/^.*id:/, "id:")
    printf("%s=%s\n", $4, $2)
}')
echo TOUCH $TOUCH
echo STYLUS $STYLUS
echo ERASER $ERASER

Încearcă scriptul ăsta.  Dacă merge, adică dacă scrie id-urile corect, poţi să copiezi bucata asta la începutul lui /usr/bin/rotateleft, în afară de cele 3 echo de la sfârşit, şi apoi foloseşti direct variabilele, deci exemplul tău ar arăta cam aşa:

Cod:

# codul de mai sus
xrandr -o left
xsetwacom set $TOUCH Rotate ccw
xsetwacom set $STYLUS Rotate ccw
sudo setkeycodes  0x71 106 0x6f 105 0x6e 103 0x6d 108

Offline

 

#3 18 Feb 2012 11:05:41

RazTaz
Membru
Locaţie: Bruxelles
Înregistrat: 17 Jan 2011
Mesaje: 853

Re: variabile multiple din output de comanda - spre fisiere multiple

Pare ca merge. N-ai idee cat de mult m-ai ajutat. Iti multumesc din tot sufletul!


SISTEM:
Ubuntu 14.04 running on Lenovo Thinkpad x220t tablet/convertible.

Offline

 

#4 18 Feb 2012 11:18:00

calvarr
Membru
Înregistrat: 09 Sep 2007
Mesaje: 1742
Site web

Re: variabile multiple din output de comanda - spre fisiere multiple

Se vede că @Viorel.Dorel știe ce scrie... te rog, poți să explici ce exact fac fiecare comandă? Mulțumesc.

Eu mai mult ca "mâța'n calendar" dar cred că merge și așa:

Cod:

#! /bin/bash
TOUCH="xsetwacom --list devices  | awk '{print $7}' | sed -n '1p'"
STYLUS="xsetwacom --list devices  | awk '{print $7}' | sed -n '2p'"
ERASER="xsetwacom --list devices  | awk '{print $7}' | sed -n '3p'"

Editezi toate fișierele tale cu acest cod^ la început, iar id: le pui respectiv $TOUCH, $STYLUS, $ ERASER
Succes.

Editat ultima oară de calvarr (18 Feb 2012 11:39:40)


tvmaxe-cli
☢☣☠

Offline

 

#5 18 Feb 2012 15:48:02

Viorel.Dorel
Membru
Înregistrat: 20 Oct 2007
Mesaje: 149

Re: variabile multiple din output de comanda - spre fisiere multiple

Da, păi şi eu m-am gândit la fel la început, dar i-am mai adus mici îmbunătăţiri.  Probabil se mai poate simplifica.

Varianta ta are cam 2 probleme.  În primul rând, te bazezi pe faptul că fiecare nume de device (partea de dinainte lui id:) are 5 cuvinte.  El a scris acolo un etc în primul post, de unde am presupus că s-ar putea să fie mai mult de 3 rânduri în outputul real, şi unele dispozitive ar putea să aibă un nume mai lung sau mai scurt, aşa că am folosit un gsub ca să şterg tot ce e înainte de id:, deci am transformat acel $7 în $2.  A doua problemă este că dacă se schimbă id-urile între ele, probabil se schimbă şi ordinea, pentru că pare să le listeze în ordinea id-urilor, deci nu mă pot baza că touch e primul şi stylus al doilea, aşa că am folosit $4 ca nume de variabilă.  Cu printf am obţinut rânduri ca TOUCH=13 şi STYLUS=14, şi am rulat rândurile astea cu eval, practic am generat o bucăţică de script cu awk.  Metoda asta nu e prea recomandată în chestii serioase, pentru că generezi script din outputul unei comenzi pe care nu o controlezi; dar în hack-uri de-astea unicat, când vrei doar să convingi o chestie să meargă rapid, e ok.  Şi în ultimul rând, rulez un singur awk ca să generez toate variabilele, în loc de un awk şi un sed pentru fiecare tongue

PS.  Ca să-ţi meargă, ar fi trebuit să foloseşti ` în loc de ", sau $( ... ) (bash 2.0+).

Offline

 
Feed

Antet forum

Powered by FluxBB