2 votos

¿Se pueden dibujar caracteres (o colores) Añadir a un menú de lista de archivo Bash?

He creado la más fea del mundo del menú utilizando el primer Linux herramienta que estoy aprendiendo, BASH.

Lo que el Menú se Ve Como

The following /usr/local/bin/bell/sounds were found
1) /usr/local/bin/bell/sounds/Amsterdam.ogg
2) /usr/local/bin/bell/sounds/bell.ogg
3) /usr/local/bin/bell/sounds/Blip.ogg
4) /usr/local/bin/bell/sounds/default.ogg
5) /usr/local/bin/bell/sounds/Mallet.ogg
6) /usr/local/bin/bell/sounds/message.ogg
7) /usr/local/bin/bell/sounds/Positive.ogg
8) /usr/local/bin/bell/sounds/Rhodes.ogg
9) /usr/local/bin/bell/sounds/Slick.ogg
'a' to hear to all files, use number to hear a single file, 
'u' to update last single file heard as new default, or 'q' to quit:

El Código

#! /bin/bash

# NAME: bell-select-menu
# PATH: /usr/local/bin
# DESC: Present menu of bell sounds to listen to all, listen to one and update default.
# CALL: bell-select-menu
# DATE: Created Oct 1, 2016.

echo "The following /usr/local/bin/bell/sounds were found"

# set the prompt used by select, replacing "#?"
PS3="'a' to hear to all files, use number to hear a single file, 
'u' to update last single file heard as new default, or 'q' to quit: "

lastfile="none"

# allow the user to choose a file
select filename in /usr/local/bin/bell/sounds/*.ogg

do

    # leave the loop if the user types 'q'
    if [[ "$REPLY" == q ]]; then break; fi

    # play all if the user types 'a'
    if [[ "$REPLY" == a ]] 
    then 
        playall-bells
        continue
    fi

    # update last file name as new default if the user types 'u'
    if [[ "$REPLY" == u ]]
    then
        if [[ "$lastfile" == none ]]
        then
            echo "No file was selected."
            break
        fi
        echo "$lastfile selected"
        cp $lastfile /usr/local/bin/bell/sounds/default.ogg
        load-default-bell
        break
    fi

    # complain if no file was selected, and loop to ask again
    if [[ "$filename" == "" ]]
    then
        echo "'$REPLY' is not a valid number"
        continue
    else
        lastfile="$filename"
    fi

    # listen to the selected file
    ogg123 "$filename"

    # loop back to ask for another
    continue
done

He basado en el código de una respuesta de AskUbuntu: Crear bash menú basado en la lista de archivos (archivos de mapa de los números). El menú se desplaza fuera de la pantalla como de las opciones de usuario repetidamente se introduce a través de, por lo que el bucle debe ser ajustado.

La más fea del mundo del menú se genera automáticamente, así que no puedo duro código ASCII caracteres de dibujo de línea en los lados izquierdo y derecho. Tengo que llamar a un programa para cambiar el formato del menú?

La mayor parte de los menús es generado por un único comando de bash:

select filename in /usr/local/bin/bell/sounds/*.ogg

He leído el manual de Bash en el select declaración, pero no veo ninguna de las opciones. Hay un programa que se puede llamar a un masaje en la pantalla?

La cosa más cercana que he encontrado se llama tput describe a continuación: linuxcommand.org/lc3_adv_tput pero no estoy seguro de si es práctico para este problema.

Gracias de antemano :)

PS Este menú es una de las herramientas para deshacerse de los molestos fuerte pitido del altavoz en el Terminal y gedit como se describe aquí: apague la Placa base/Altavoz del equipo de sonido "bip" en Ubuntu 16.04 de regresión


Editar - Incorporando Aceptado Respuesta

Muchas gracias a wjandrea para la publicación de código para limpiar el menú. Previo a la aceptación de respuesta que se había añadido un código de color en echo cadenas y PS3 (símbolo del sistema). Yo también había puesto en un bucle para volver a dibujar el menú para evitar que se desplace fuera de la pantalla. También me puso en un reset para borrar la pantalla antes de volver a pintar. Esto evita que más y copia antigua (a veces truncado) y copia nueva del menú que aparece al mismo tiempo.

Menú Nuevo Look

Los colores no son exactamente representado cuando se copia desde la terminal de salida de texto y pegarlo en AskUbuntu.

=====  Sound Files for Bell in /usr/local/bin/bell/sounds/  ====

1) Amsterdam.ogg  4) default.ogg    7) Positive.ogg
2) bell.ogg       5) Mallet.ogg     8) Rhodes.ogg
3) Blip.ogg       6) message.ogg    9) Slick.ogg

===========================  Options  ==========================

'a' to hear to all files, use number to hear a single file, 
'u' update last number heard as new bell default, 'q' to quit: 

Esto es todo lo que aparece en la pantalla ahora. No hay ninguna $ sudo bell-menu instrucción call visible. Ningún otro de la historia de los anteriores comandos escritos visible.

Una captura de pantalla muestra los colores con precisión y se puede ver la pantalla ha sido mediante programación en blanco:

bell-menu

Nuevo Código De Menú

#! /bin/bash

# NAME: bell-menu
# PATH: /usr/local/bin
# DESC: Present menu of bell sounds to listen to all, listen to one and update default.
# CALL: sudo bell-menu
# DATE: Created Oct 6, 2016.

# set the prompt used by select, replacing "#?"
PS3="
===========================  Options  ==========================

$(tput setaf 2)'$(tput setaf 7)a$(tput setaf 2)' to hear to all files, use $(tput setaf 7)number$(tput setaf 2) to hear a single file, 
'$(tput setaf 7)u$(tput setaf 2)' update last number heard as new bell default, '$(tput setaf 7)q$(tput setaf 2)' to quit: $(tput setaf 7)"

cd /usr/local/bin/bell/sounds/

# Prepare variables for loops
lastfile="none"
wend="n"

while true; do

  tput reset # Clear screen so multiple menu calls can't be seen.

  echo
  echo -e "===== \e[46m Sound Files for Bell in /usr/local/bin/bell/sounds/ \e[0m ===="
  echo

  # allow the user to choose a file
  select soundfile in *.ogg; do

    case "$REPLY" in
        q) # leave the loop if the user types 'q'
            wend="y" # end while loop
            break    # end do loop
            ;;
        a) # play all if the user types 'a'
            playall-bells
            break    # end do loop
            ;;
        u) # update last file name as new default if the user types 'u'
            if [[ "$lastfile" == none ]]; then
                echo "No file has been heard to update default. Listen first!"
                continue  # do loop repeat
            fi
            echo "$lastfile selected"
            cp "$lastfile" default.ogg
            load-default-bell
            wend="y" # end while loop
            break    # end do loop
            ;;
    esac

    # complain if no file was selected, and loop to ask again
    if [[ "$soundfile" == "" ]]; then
        echo "$REPLY: not a valid selection."
        continue    # repeat do loop
    else
        lastfile="$soundfile"
    fi

    # listen to the selected file
    canberra-gtk-play --file="$soundfile"

    # loop back to ask for another
    break
  done
  if [[ "$wend" == "y" ]]; then break; fi

done

El menú se cambia de bell-select-menu a bell-menu. Porque reside en /usr/local/bin debe ser llamado con el sudo bell-menu , y los comentarios se han actualizado para reflejar este hecho.

Con un poco de trabajo la más fea del mundo del menú y ahora convertido en aceptable y buscando (pero no bello) del menú.

2voto

Burnaby Puntos 57

Esto es lo que yo haría. La cosa más importante que he cambiado es que el guión se mueve al directorio antes de listar los archivos, y los enumera como su ruta de acceso relativa en lugar de su ruta de acceso absoluta.

También, he hecho $PS3 mucho menor; se usa canberra-gtk-play porque es preinstalado, donde ogg123 no; y se utiliza un case instrucción en lugar de múltiples if declaraciones.

Yo pude probar porque me estoy quedando en la 14.04.

#! /bin/bash

# NAME: bell-select-menu
# PATH: /usr/local/bin
# DESC: Present menu of bell sounds to listen to all, listen to one and update default.
# CALL: bell-select-menu
# DATE: Created Oct 1, 2016.

# set the prompt used by `select`, replacing "#?"
PS3=": "

echo "Options:
a) Play all 
u) Set the last file played as the new default
q) Quit
The following sounds were found in /usr/local/bin/bell/sounds/:"

cd /usr/local/bin/bell/sounds/

# Prepare var for the loop.
lastfile="none"

# allow the user to choose a file
select soundfile in *.ogg; do

    case "$REPLY" in
        q) # leave the loop if the user types 'q'
            break
            ;;
        a) # play all if the user types 'a'
            playall-bells
            continue
            ;;
        u) # update last file name as new default if the user types 'u'
            if [[ "$lastfile" == none ]]; then
                echo "No file was selected."
                break
            fi
            echo "$lastfile selected"
            cp "$lastfile" default.ogg
            load-default-bell
            break
            ;;
    esac

    # complain if no file was selected, and loop to ask again
    if [[ "$soundfile" == "" ]]; then
        echo "$REPLY: not a valid selection."
        continue
    else
        lastfile="$soundfile"
    fi

    # listen to the selected file
    canberra-gtk-play --file="$soundfile"

    # loop back to ask for another
    continue
done

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: