es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo escribir un script proc tcl para utilizarlo como línea de comando en la terminal de Shell, con una opción adicional, y también poder completar esta opción con la tecla de tabulación.

Quiero escribir un script de tcl, el cual tendrá un proc que cuando ejecuto el script, puedo utilizar el proc como una línea de comandos en la Terminal tcsh, y también puedo usar opciones con él, y además presionar Tab para mostrar las opciones o completarlas si solo hay una opción.
Por ejemplo, quiero que pueda funcionar así:
!/usr/bin/tclsh
proc test {} {}
$ test archivo1 -option1 true -option2 archivo2 -Option3 0

– Y así: Cuando escribo:
$ test archivo1 -
Y luego presiono Tab, puedo ver:
-option1 -option2 -Option3
Y si sigo presionando O, la opción se completa automáticamente -Option3

Básicamente estoy tratando de escribir un script de tcl que me permita utilizarlo como una línea de comandos, como otros comandos, pero con mis opciones y funciones que escribo en el script.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para crear un script Tcl con un proc que pueda funcionar como una línea de comandos en la terminal tcsh y también permita opciones y completado de pestañas, puedes usar el siguiente enfoque:

    #!/usr/bin/tclsh
    
    proc test {file1 args} {
        set option1 false
        set option2 ""
        set option3 1
    
        set validArgs "-option1 -option2 -option3"
        set completions [list]
        foreach arg $validArgs {
            if {[string match "*$arg*" $args]} {
                lappend completions $arg
            }
        }
    
        # Utiliza el comando "lindex" para obtener el primer argumento después del
        # nombre del proc, que debe ser el parámetro "file1" que queremos.
        puts "file1: $file1"
    
        # Utiliza el comando "foreach" para iterar sobre los argumentos restantes
        # y procesar cualquier opción conocida.
        foreach arg $args {
            switch -- $arg {
                "-option1" { set option1 true }
                "-option2" { set option2 [lindex $args [expr [lsearch -exact $args $arg]+1]] }
                "-option3" { set option3 [lindex $args [expr [lsearch -exact $args $arg]+1]] }
            }
        }
    
        puts "option1: $option1"
        puts "option2: $option2"
        puts "option3: $option3"
    
        # Utiliza el comando "return" para indicar éxito (0) o fracaso (diferente de cero).
        return 0
    }
    
    # Registra el proc "test" con el comando "complete" para habilitar el completado de pestañas.
    complete test "c/-/(file1) $validArgs/+/"
    
    # Utiliza el comando "if" para verificar si el script se ejecutó directamente o fue incluido.
    if {[info script] eq $argv0} {
        # Utiliza el comando "lrange" para obtener todos los argumentos después del primero (es decir, el "nombre del proc").
        set args [lrange $argv 1 end]
    
        # Llama al proc "test" con el parámetro "file1" y cualquier argumento restante.
        test [lindex $argv 0] $args
    
        # Utiliza el comando "exit" para indicar terminación normal.
        exit 0
    }
    

    En este script, el proc test toma dos parámetros: file1 y args. El parámetro file1 es el argumento posicional requerido que debe proporcionarse primero cada vez que se llame al proc. El parámetro args es para cualquier argumento adicional que se pueda pasar después de file1, incluidas las opciones.

    Dentro del proc test, utilizamos el comando set para inicializar tres variables: option1, option2 y option3. También definimos una variable validArgs, que es una lista separada por espacios de todos los nombres de opciones que el proc reconocerá.

    Luego utilizamos un bucle foreach para recorrer la lista $args y procesar cualquier opción conocida. Si se reconoce una opción, su variable correspondiente se establece como el valor del siguiente argumento en la lista.

    Para habilitar el completado de pestañas, utilizamos el comando complete para registrar el proc test en el sistema de completado de la shell. El argumento del comando complete le indica a la shell que complete cualquier cadena que comience con test (es decir, el nombre del proc). La parte c/-/(file1) indica que la primera completación debe ser para un nombre de archivo (es decir, el parámetro file1). La variable $validArgs se expande a una lista de todos los nombres de opciones válidas, por lo que la shell completará cualquier cadena que comience con - con una de esas opciones.

    Finalmente, utilizamos el comando if para verificar si el script se ejecutó directamente (es decir, desde la línea de comandos) o se incluyó (es decir, se agregó en otro script con el comando source). Si el script se ejecutó directamente, extraemos el parámetro file1 y cualquier argumento adicional de los argumentos de la línea de comandos ($argv) y llamamos al proc test con esos parámetros. Luego utilizamos el comando exit para indicar terminación normal.

Comments are closed.