atsiv Opublikowano 25 Marca 2010 Zgłoś Opublikowano 25 Marca 2010 Ostatnio postanowiłem pisać skrypty w bashu, który będzie wyświetlać okienka w trybie graficznym. Za wszystko odpowiada zenity i utworzyłem coś podobnego jak na obrazku: http://rafal.drezek.info/wp-content/uploads/2009/05/okienko-wyboru.jpg Wszystko fajnie, wszystko działa, ale denerwuje mnie ten pasek wybierz/odpowiedź. Czy da się go jakoś usunąć lub zablokować, ponieważ gdy kliknę np. na odpowiedź, wszystkie opcje są sortowane alfabetycznie, a ja nie chcę żeby tak mi się robiło. Wie ktoż może, bo nie mogę znaleźć nic na ten temat? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
WebNuLL Opublikowano 26 Marca 2010 Zgłoś Opublikowano 26 Marca 2010 Paska zapewne nie można usunąć, ale możesz nie wstawiać do niego tekstu. -- WebNuLL Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
atsiv Opublikowano 26 Marca 2010 Zgłoś Opublikowano 26 Marca 2010 (edytowane) Hmm.. jeśli nie wstawię tekstu i kliknę na to pole, to sortuje wpisy na liście alfabetycznie, właśnie to mi przeszkadza trochę, bo chciałbym, aby przynajmniej on nie działał skoro nie da się go usunąć. Edytowane 26 Marca 2010 przez atsiv Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Gość <account_deleted> Opublikowano 26 Marca 2010 Zgłoś Opublikowano 26 Marca 2010 Hmm.. jeśli nie wstawię tekstu i kliknę na to pole, to sortuje wpisy na liście alfabetycznie, właśnie to mi przeszkadza trochę, bo chciałbym, aby przynajmniej on nie działał skoro nie da się go usunąć. Zenity to nie jest graficzne API dla basha - to prosty sposób na graficzną interakcję. IMO masz 2 wyjścia: zmodyfikować żródło Zenity lub poprostu użyć listy z numerkami: "1. cośtam, 2. inne cośtam" ;) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
atsiv Opublikowano 27 Marca 2010 Zgłoś Opublikowano 27 Marca 2010 Myślałem nad tymi numerkami i tak myślałem, że będzie to chyba jedyne wyjście. No cóż, trzeba się cieszyć z tego co mamy :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Gość <account_deleted> Opublikowano 27 Marca 2010 Zgłoś Opublikowano 27 Marca 2010 No ale mamy tego więcej: notify-send, xautomation i parę innych ;) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
atsiv Opublikowano 30 Marca 2010 Zgłoś Opublikowano 30 Marca 2010 (edytowane) Wiem, wiem :) A tak na marginesie, nie chcę zakładać nowego tematu, ponieważ to również dotyczy basha. Załóżmy, że mam taką funkcję: pobierz(){sudo aptitude update}aktualizuj(){sudo aptitude upgrade}aktualizujjeden(){sudo aptitude dist-upgrade}zrob(){echo 'prosze czekac'$*echo 'zakonczono'read} Teraz chciałbym, aby skrypt zrobił coś takiego: zrob pobierz Działa. A teraz chciałbym zrobić coś takiego: zrob pobierz aktualizuj aktualizujjeden Już nie. Jak to zrobić, żeby to działało? Czytałem o zmiennej IFS w internecie i że tym można zrobić, żeby to zadziało ale nie wychodzi mi. Edytowane 30 Marca 2010 przez atsiv Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Gość <account_deleted> Opublikowano 30 Marca 2010 Zgłoś Opublikowano 30 Marca 2010 ... zrob(){echo 'prosze czekac'$*echo 'zakonczono'read}Czytałem o zmiennej IFS w internecie i że tym można zrobić, żeby to zadziało ale nie wychodzi mi. zrob() {IFS='; 'echo 'prosze czekac'e.val "$*" echo 'zakonczono'read}evaluateuate << co to za shit?#!fuck! e.v.a.l to nie jewane "evaluate", tym bardziej w tagach Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
atsiv Opublikowano 30 Marca 2010 Zgłoś Opublikowano 30 Marca 2010 (edytowane) Wielkie dzięki, załapałem wreszcie to, może instrukcja Twoja jest krótka, ale zrozumiała :) Powiem Ci, że teraz inaczej to widzę niż wcześniej, ponieważ mój znajomy jak tłumaczył mi to, aż się zamotałem ;) Edytowane 30 Marca 2010 przez atsiv Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
atsiv Opublikowano 30 Marca 2010 Zgłoś Opublikowano 30 Marca 2010 (edytowane) Tak na marginesie czy ten IFS jest potrzebny, bo mi bez tego również działa? ;) PS. Na prośbę znajomego, który też poznaje basha. Swój skrypt uruchamia za pomocą sudo: sudo skrypt.sh. Jeśli wybierze opcję gconf-editor to wiadomo, że zmiany wtedy będą dotyczyć konta root. Czy dałoby się zrobić jakieś polecenie lub funkcję, która będzie uruchamiać gconf-editor na zwykłym użytkowniku, na którym teraz się pracuje? Np. ktoś jest zalogowany na koncie 'Dom', odpala skrypt na koncie root, ale chciałby żeby skrypt jedną rzecz wykonał na zwykłym koncie i potem dalej pracował na roocie. Edytowane 31 Marca 2010 przez atsiv Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Gość <account_deleted> Opublikowano 31 Marca 2010 Zgłoś Opublikowano 31 Marca 2010 Tak na marginesie czy ten IFS jest potrzebny, bo mi bez tego również działa? ;)Dziala? hmm...wrzuć to w plik.sh i odpal:#!/bin/bashfn1() {echo "Fn1"}fn2() {echo "Fn2"}fn3() {echo "Fn3"}run() {evaluateuate "$*" #e.v.a.l. }IFS=" " #default valueecho "IFS=\" \" test: run fn1 fn2 fn3"run fn1 fn2 fn3IFS=";" #IFS set to semicolon - command separatorecho "IFS=\";\" test: run fn1 fn2 fn3"run fn1 fn2 fn3IFS=" " #IFS restoreexit 0;) Co do Gconf: nie bardzo jarzę po co takie rozwiązanie - imo bez sesnsu, ale jeśli już to przecież jest to banalne: >su [user] [programm]; exit ;) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
atsiv Opublikowano 1 Kwietnia 2010 Zgłoś Opublikowano 1 Kwietnia 2010 To wtedy co innego i tutaj IFS już się przydaje :) Jeśli chodzi o zwykłe konto i root, on robi 99% rzeczy na koncie root i 1% chciał zrobić na zwykłym koncie ;) Ja na ogól trzymam się innej praktyki, ale ona ma inne widocznie wymagania. A jeszcze jedno pytanie: aktualizujos(){gksu aptitude updategksu aptitude upgradegksu aptitude dist-upgrade}aktualizujos | zenity --progress --pulsate Gdybym dał samo 'aktualizujos', wtedy ładnie by ta funkcja zadziałała, ale jak dołożę zenity już coś nie... gdzie tu jest błąd? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Gość <account_deleted> Opublikowano 1 Kwietnia 2010 Zgłoś Opublikowano 1 Kwietnia 2010 #!/bin/bashfn4() {echo -e "\n5% \n#Updating...";sleep 1.5echo -e "\n33% \n#Upgrading..."; sleep 1.5echo -e "\n66% \n#Upgrading..."; sleep 1.5echo -e "\n100% \n#Done"}fn4 |zenity --progressexit 0... chyba wypadało by coś wysłać do progress bara ;) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
atsiv Opublikowano 1 Kwietnia 2010 Zgłoś Opublikowano 1 Kwietnia 2010 (edytowane) fn4() {echo -e "\n5% \n#Updating..."; sleep 1.5gksudo 'aptitude update'echo -e "\n33% \n#Upgrading..."; sleep 1.5gksudo 'aptitude -y upgrade'echo -e "\n66% \n#Upgrading..."; sleep 1.5gksudo 'aptitude -y dist-upgrade'echo -e "\n100% \n#Done"}fn4 | zenity --progressexit 0 Zrobiłem, tzn. przerobiłem Twój kod i chyba będzie działać, bo na razie nie mam jak sprawdzić. Edytowane 1 Kwietnia 2010 przez atsiv Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Gość <account_deleted> Opublikowano 1 Kwietnia 2010 Zgłoś Opublikowano 1 Kwietnia 2010 (edytowane) heh, ten przykład miał na celu jedynie pokazanie sposobu wysyłania danych do zenity ;) Oczywiście Twoja przeróbka będzie działać, ale to kiepskie rozwiązanie. Porządny skrypt powinien wyciągnąć dane z aptitude, przliczyć % z aptitude na % całości i dopiero takie coś pokazać użytkownikowi. edit: aaa, no i po co Ci to sleep? ;) Edytowane 1 Kwietnia 2010 przez tomazzi Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
atsiv Opublikowano 1 Kwietnia 2010 Zgłoś Opublikowano 1 Kwietnia 2010 żeby o 1,5 sekundy było opóźnienie, a tak na serio tak tylko przypadkowo jest :) jeśli chodzi o te % aż tak dokładnie nie musi być ;) ale wget umiem namówić aby pokazywał dokładnie w procentach ile pobrało się, w przypadku aptitude nigdy nie sprawdzałem. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
atsiv Opublikowano 27 Kwietnia 2010 Zgłoś Opublikowano 27 Kwietnia 2010 (edytowane) Zrobiłem skrypt, a właściwe przerobiłem czyjś: - while ...- menu główne: zenity z radiolist- case (1), 2), 3) itd.) Mogę powiedzieć tylko tyle, że działa. Ale zamiast radiolist chcę dać checklist, gdy wybieram kilka pozycji już nie i nie wiem dlaczego tak się dzieje? Edytowane 27 Kwietnia 2010 przez atsiv Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Gość <account_deleted> Opublikowano 27 Kwietnia 2010 Zgłoś Opublikowano 27 Kwietnia 2010 Mogę powiedzieć tylko tyle, że działa. Ale zamiast radiolist chcę dać checklist, gdy wybieram kilka pozycji już nie i nie wiem dlaczego tak się dzieje?...bo zenity wymaga odpowiedniej składni. Poza tym wypadałoby podać nieco bardziej cośmówiący fragment skryptu... ;) Ogólnie checkbox-lista powinna wyglądać jakoś tak: #!/bin/bashcolumndesc='--column "" --column "Name" --column "Describtion"'list=' \. row1 desc1 \. row2 desc2 \. row3 desc3 \. row4 desc4'ev.al "zenity --list --multiple --checklist --text="Select" $columndesc $list "; exit 0 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
atsiv Opublikowano 2 Czerwca 2010 Zgłoś Opublikowano 2 Czerwca 2010 Zrobiłem sonie taki skrypt: echo "podaj wyrazy:"read 1wyr 2wyr 3wyrecho "podałeś: $1wyr $2wyr 3$wyr" pies kto kaczka - działa pies kot tygrys lampart kaczka - jak zrobić żeby kot, tygrys, lampart były tam gdzie $2wyr? oraz skrypt z zenity: zenity --entry | read 1wyr 2wyr 3wyrzenity --info "podałeś: $1wyr $2wyr 3$wyr"Ten drugi kompletnie mi nie działa. Jak poprawnie powinien wyglądać? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Gość <account_deleted> Opublikowano 2 Czerwca 2010 Zgłoś Opublikowano 2 Czerwca 2010 pies kot tygrys lampart kaczka - jak zrobić żeby kot, tygrys, lampart były tam gdzie $2wyr?Ten "problem" można rozwiązać na wiele sposobów, ale podam najbardziej uniwersalny, oparty na tablicach: #!/bin/bashread -a usrinputnumwords=${#usrinput[@]}; lastindex=$((numwords-1))echo -en "entered: \"${usrinput[*]}\" , =$numwords words, last index=$lastindex\n"#print array elementsecho -en "\nlist words in array:\n"n=0while (( n <= lastindex ));do echo -en "word($n)= \"${usrinput[$n]}\"\n" (( n++ ))done#do the trick ;)word1=${usrinput[0]}word3=$(echo ${usrinput[$lastindex]})#"remove" element 0 and last from array:usrinput[0]=""; usrinput[$lastindex]=""word2=${usrinput[*]}echo -en "\nword1=$word1 \nword2=$word2 \nword3=$word3\n\n"exit 0 :P ... a co do zenity: warto przeczytać man do końca, gdzie pisze coś o opcji --text= ;) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
atsiv Opublikowano 6 Sierpnia 2010 Zgłoś Opublikowano 6 Sierpnia 2010 (edytowane) Mam mały i nowy problem, z którym walczę od kilku dni. Załóżmy, że mam skrypt, który aktualizuje system apt-getem: ( sudo apt-get updatesudo apt-get upgrade ) | zenity --progress --pulsateif [ $? = 0 ] sudo killall apt-get zenity --errorelse zenity --infofi Ogólnie działa, ale nie tak jak ja bym chciał, ponieważ: 1) zenity od razu nie pulsuje, tylko po kilku sekundach, czy da się zrobić, aby od razu to robił? 2) gdy nacisnę na przycisk Cancel skrypt nie zabija apt-geta, tzn. czeka gdy skończy działać upgrade i dopiero wtedy zadziała killall, a ja chcę żeby to polecenie zadziałało w trakcie działania apt-get, a nie po, da się tak zrobić? Tzn. wiem, że istnieje coś takiego jak auto-kill, ale gdy chce aby skrypt informował o błędzie to coś nie działa on... Edytowane 6 Sierpnia 2010 przez atsiv Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Gość <account_deleted> Opublikowano 7 Sierpnia 2010 Zgłoś Opublikowano 7 Sierpnia 2010 (edytowane) 1. Wkraczasz na bardzo niebezpieczy grunt używając killall w stosunku do apta. 2. U mnie pulsate działa od razu, po wpisaniu >sudo apt-get update | zenity --progress --pulsate. Słów kilka na ten temat: --pulsate jest specyficznym trybem oznaczającym "nie wiem ile czasu do końca, ale żyję" ;) Jeśli pipe wyśle jedną daną o wartości "0%" pulsate nie zadziała, ponieważ używay jest tryb "determinate mode", czyli z określonymi wartościami: max i aktualną. "Indeterminate mode" (--pulsate) włącza się automatycznie po pewnym czasie - jeśli nie pojawią się kolejne dane wejściowe. 3. "Subprocess" nie może zabić "parent process" a już na pewno nie w taki sposób jak Twój. Jedyną opcją jest użycie "process substitution" oraz apta w tle -> musisz mieć jakiś działający proces nadrzędny względem apt. edit: ...co w Tym przypadku sprowadza się do dopisania "&" w nawiasach obejmujących apt ;) ...forking in subshell, brakuje tylko evaluateuate i exec do kompletu... ;) Edytowane 9 Sierpnia 2010 przez tomazzi Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
atsiv Opublikowano 9 Sierpnia 2010 Zgłoś Opublikowano 9 Sierpnia 2010 (edytowane) Albo można zrobić tak: ( apt-get update ; apt-get upgrade ) | ( if [ ! `zenity --progress --pulsate` ] then kill apt-get fi ) Ale tak jak pisałeś dla "apta" to jest niebezpieczne i masz tutaj rację. A dałoby się Twoim zdaniem zrobić coś takiego, że przycisk Anuluj nic by nie robił, tzn. klikam na niego, a "progress" dalej sobie pulsuje, zamiast wyłączyć okienko. Hmm a jak jest z output? Czy wynik wyjściowy można odczytać tylko z pliku? I jeszcze jedno malutkie pytanie, załóżmy sobie, że masz funkcję: costam { blablabla $* } i jak chce zrobić coś takiego: costam `apt-get update apt-get upgrade` to coś nie łapie... co tu źle robię? Edytowane 9 Sierpnia 2010 przez atsiv Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Gość <account_deleted> Opublikowano 10 Sierpnia 2010 Zgłoś Opublikowano 10 Sierpnia 2010 costam `apt-get update apt-get upgrade` to coś nie łapie... co tu źle robię? o ile dobrze rozumiem problem - to już to przerabialiśmy -> IFS... Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
atsiv Opublikowano 23 Października 2010 Zgłoś Opublikowano 23 Października 2010 (edytowane) 3. "Subprocess" nie może zabić "parent process" a już na pewno nie w taki sposób jak Twój. Jedyną opcją jest użycie "process substitution" oraz apta w tle -> musisz mieć jakiś działający proces nadrzędny względem apt. edit: ...co w Tym przypadku sprowadza się do dopisania "&" w nawiasach obejmujących apt ;) ...forking in subshell, brakuje tylko evaluateuate i exec do kompletu... ;) Sorki, że po takim czasie wracam do tego punktu, ale Tobie chodziło o coś takiego prawda: exec 3> >(zenity --progress --pulsateifkillfi)aplikacja >&3exec 3>&-albo: (sudo apt-get update &) | zenity --progress --pulsate Edytowane 23 Października 2010 przez atsiv Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Gość <account_deleted> Opublikowano 24 Października 2010 Zgłoś Opublikowano 24 Października 2010 No mniej więcej, ale to co napisałeś nie jest bezpieczne. Coś u mnie nie chce działać wercja 2 -> ale jestem już mocno znietrzeźwiony, więc sprawdzę jutro... ;) ... czyli dzisiaj Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
atsiv Opublikowano 24 Października 2010 Zgłoś Opublikowano 24 Października 2010 U mnie 2ga wersja działa, oczywiście ustawiłem if dla przycisków i dałem killa, ale nie bierz apta pod uwagę bo to był przykład tylko. Dla apta wyłączam przycisk anuluj. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Gość <account_deleted> Opublikowano 25 Października 2010 Zgłoś Opublikowano 25 Października 2010 (edytowane) U mnie 2ga wersja działa heh, u mnie też ale mi na wzrok padło... a może tak: #!/bin/bashdeclare tmpsdeclare usrbutton( { #foreground blockwhile read tmps; do echo $tmps if [ "$tmps" == "80%" ]; then break fi read -t 0.1 usrbutton <&2 if [ "$usrbutton" == "cancel" ]; then break fidone; } ) < <( { #bg block 1 i=0 while [ $i -lt 101 ]; do echo "$i%" sleep 0.5 ((i+=10)) done; } & ) > >( { #bg block 2 zenity --progress --auto-close if [ $? == 1 ]; then echo "cancel" >&2 fi } & )exit 0 bg block 1 - aplikacja dająca "procenty" (nie mylić z moderatorem) ;) zenity return status == 1 wypluty do stderr "foreground block" przerywa działanie przy 80% lub po odczytaniu "cancel" z stderr. Oczywistą "niedoróbką" jest użycie stderr zamiast dedykowanego FD - w pewnych sytuacjach "cancel" może być nadpisane przez inną wartość. Edytowane 25 Października 2010 przez tomazzi Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
atsiv Opublikowano 28 Października 2010 Zgłoś Opublikowano 28 Października 2010 Ło ale kod strzeliłeś :) ale biorąc pod uwagę bezpieczne sytuacje, myślę że wystarczy prosty kod z killallem. A tak na marginesie czytam kurs o zenity i zastanawia mnie jedna rzecz, 1 oznacza anuluj, 0 ok, a -1 powinno znaczyć, że coś nie zostało zaznaczone... Właśnie utworzyłem zenity list (tabela | zenity list ...), przycisk 1 i 2 działają, ale jak nic nie zaznaczę to zamiast -1 z informacją, że nic nie zostało zaznaczone, uaktywnia mi się przycisk 1. Coś źle robię? Mało tego był tam gotowy skrypt i on u mnie też nie działa jak oczekuję. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Gość <account_deleted> Opublikowano 28 Października 2010 Zgłoś Opublikowano 28 Października 2010 (edytowane) ...zwykłe process substitution w dwóch kierunkach + "bypass" przez stderr ;) Link do skryptu lub istotny fragment? - było by zdecydowanie łatwiej... Edytowane 28 Października 2010 przez tomazzi Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...