Os caracteres de desenho de linha (ou cores) podem ser adicionados a um menu da lista de arquivos Bash?

2

Eu criei o menu mais feio do mundo usando a primeira ferramenta Linux que estou aprendendo, BASH.

Como o menu se parece

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:

O 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

Eu baseei o código em uma resposta do AskUbuntu: Criar menu bash baseado na lista de arquivos (mapear arquivos para números) . O menu rola para fora da tela, já que as opções do usuário são inseridas repetidamente, então o loop precisa ser ajustado.

O menu mais feio do mundo é gerado automaticamente para que eu não possa codificar caracteres de desenho de linha ASCII nos lados esquerdo e direito. Eu precisaria chamar um programa para reformatar o menu?

A maior parte do menu é gerada por um único comando bash:

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

Eu li o manual do Bash na instrução select , mas não vejo nenhuma opção. Existe um programa que pode ser chamado para massagear a tela?

A coisa mais próxima que encontrei é chamada tput descrita aqui: linuxcommand.org/lc3_adv_tput mas não estou certeza se é prático para este problema.

Agradecemos antecipadamente:)

PS Este menu é uma das ferramentas para se livrar do bipe do alto-falante no Terminal e gedit como descrito aqui: Desligue a placa-mãe / PC Speaker" beep "no Ubuntu 16.04 regressão

Editar - Incorporando Resposta Aceitada

Muito obrigado a wjandrea por postar código para limpar o menu. Antes da resposta aceita, eu adicionei código para cor em echo strings e PS3 (prompt). Eu também coloquei um loop para redesenhar o menu para evitar que ele rolasse para fora da tela. Eu também coloquei um reset para limpar a tela antes de repintar. Isso impede que mais e mais cópias antigas (às vezes truncadas) e nova cópia do menu apareçam ao mesmo tempo.

Novo visual de menu

As cores não são representadas com precisão quando copiadas da saída de texto do terminal e coladas no 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: 

Isso é tudo o que aparece na tela agora. Não há nenhuma instrução de chamada $ sudo bell-menu visível. Nenhum outro histórico de comandos anteriores foi digitado.

Uma captura de tela mostra as cores com precisão e você pode ver que a tela foi apagada programaticamente:

Novo código de menu

#! /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

O menu foi renomeado de bell-select-menu para bell-menu . Como ele reside em /usr/local/bin , ele precisa ser chamado com sudo bell-menu e os comentários foram atualizados para refletir esse fato.

Com um pouco de trabalho, o menu mais feio do mundo e agora se torna um menu aceitável (mas não bonito).

    
por WinEunuuchs2Unix 04.10.2016 / 01:49

1 resposta

2

Veja como eu faria isso. A coisa mais importante que eu mudei é que o script se move para o diretório antes de listar os arquivos, e os relaciona como seu caminho relativo em vez de seu caminho absoluto.

Além disso, tornei $PS3 muito menor; usou canberra-gtk-play porque está pré-instalado, onde ogg123 não é; e usou uma instrução case em vez de várias instruções if .

Eu não pude testá-lo porque estou executando 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
    
por wjandrea 05.10.2016 / 05:50