¿Cómo obtener la entrada de la GUI del usuario desde los scripts BASH?

1

Desde una secuencia de comandos BASH quiero obtener información del usuario y cambiar la configuración del sistema, en un bucle. Primero probé cocoaDialog pero tiene un error fatal: los diálogos siempre están encima de otras ventanas.

Idealmente, podría abrir un cuadro de diálogo con los botones "Configuración del modo de suspensión" y "Activar el modo de activación" (para alternar el botón "Evitar que la computadora se duerma automáticamente cuando la pantalla está apagada") y el cuadro de diálogo / ventana se mantendría cuando se pulsan los botones. En el caso de cocoaDialog, tuve que abrir un nuevo diálogo cada vez que se presionaba un botón. Hubiera estado bien, pero aparte del problema anterior ya mencionado, colocar un nuevo cuadro de diálogo lo coloca en el centro de la pantalla y no donde estaba el anterior (y cocoaDialog no tiene argumentos de posicionamiento para los cuadros de diálogo).

¿Alguien sabe de una solución? Sospecho que AppleScript funcionaría, pero es muy complejo y no he podido encontrar ejemplos adecuados que pueda copiar / modificar.

Gracias.

    
pregunta e40 24.11.2015 - 19:59

1 respuesta

1

He encontrado dos soluciones. El mejor es el segundo.

Solución # 1: usar 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

donde prevent_computer_sleep solo hace sudo pmset sleep 0 y allow_computer_sleep hace sudo pmset sleep 1 .

Solución # 2: modifique KeepingYouAwake para usar el sistema en modo de suspensión y no mostrar el modo de espera: mi tenedor de KeepingYouAwake .

    
respondido por el e40 29.11.2015 - 17:14

Lea otras preguntas en las etiquetas