Come ottenere l'input della GUI dell'utente dagli script di BASH?

1

Da uno script BASH voglio ottenere l'input dell'utente e modificare le impostazioni di sistema, in un ciclo. Ho provato per la prima volta cocoaDialog ma questo ha un difetto fatale: le finestre di dialogo sono sempre in cima ad altre finestre.

Idealmente, potrei aprire una finestra di dialogo con "imposta modalità sleep" e "imposta modalità sveglia" (per attivare i pulsanti "Impedisci al computer di dormire automaticamente quando il display è spento") e la finestra di dialogo / finestra rimarrebbe quando i pulsanti sono premuti. Nel caso di cocoaDialog, dovevo aprire una nuova finestra di dialogo ogni volta che veniva premuto un pulsante. Sarebbe andato bene, ma a parte il problema sopra menzionato, mettere una nuova finestra di dialogo lo posiziona al centro dello schermo e non dove era il vecchio (e cocoaDialog non ha argomenti di posizionamento per le finestre di dialogo).

Qualcuno sa di una soluzione? Sospetto che AppleScript funzioni, ma è così complesso e non sono riuscito a trovare esempi adatti che potessi copiare / modificare.

Grazie.

    
posta e40 24.11.2015 - 19:59
fonte

1 risposta

1

Ho trovato due soluzioni. Il migliore è il secondo.

Soluzione 1: usa Tcl / Tk:

#! /usr/bin/env wish8.5
# Adapted from brilliant example here:
#   http://stackoverflow.com/questions/166231/tcl-tk-examples

package require Tk

proc main {} {
if {[lsearch -exact [font names] TkDefaultFont] == -1} {
    # older versions of Tk don't define this font, so pick something
    # suitable
    font create TkDefaultFont -family Helvetica -size 12
}
# in 8.5 we can use {*} but this will work in earlier versions
eval font create TkBoldFont [font actual TkDefaultFont] -weight bold

buildUI
}

proc buildUI {} {
frame .toolbar
scrollbar .vsb -command [list .t yview]
text .t \
    -width 80 -height 10 \
    -yscrollcommand [list .vsb set] \
    -highlightthickness 0
.t tag configure command -font TkBoldFont
.t tag configure error   -font TkDefaultFont -foreground firebrick
.t tag configure output  -font TkDefaultFont -foreground black

grid .toolbar -sticky nsew
grid .t .vsb  -sticky nsew
grid rowconfigure . 1 -weight 1
grid columnconfigure . 0 -weight 1

set i 0
foreach {label command} {
    awake     {prevent_computer_sleep}
    sleep     {allow_computer_sleep}
    status    {pmset -g | grep sleep}
} {
    button .b$i -text $label -command [list runCommand $command]
    pack .b$i -in .toolbar -side left
    incr i
}
}

proc output {type text} {
.t configure -state normal
.t insert end $text $type "\n"
.t see end
.t configure -state disabled
}

proc runCommand {cmd} {
output command $cmd
set f [open "| $cmd" r]
fconfigure $f -blocking false
fileevent $f readable  [list handleFileEvent $f]
}

proc closePipe {f} {
# turn blocking on so we can catch any errors
fconfigure $f -blocking true
if {[catch {close $f} err]} {
    output error $err
}
}

proc handleFileEvent {f} {
set status [catch { gets $f line } result]
if { $status != 0 } {
    # unexpected error
    output error $result
    closePipe $f

} elseif { $result >= 0 } {
    # we got some output
    output normal $line

} elseif { [eof $f] } {
    # End of file
    closePipe $f

} elseif { [fblocked $f] } {
    # Read blocked, so do nothing
}
}

main

dove prevent_computer_sleep fa solo sudo pmset sleep 0 e allow_computer_sleep fa sudo pmset sleep 1 .

Soluzione 2: modifica KeepingYouAwake per utilizzare la sospensione del sistema e non visualizzare la sospensione: la mia forcella di KeepingYouAwake .

    
risposta data 29.11.2015 - 17:14
fonte

Leggi altre domande sui tag