Можно ли добавлять символы рисования линий (или цвета) в меню списка файлов Bash?
Я создал самое уродливое меню в мире, используя первый инструмент для Linux, который я изучаю, BASH.
Как выглядит меню
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:
Код
#! /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
Я основал код на ответе AskUbuntu: создать меню bash на основе списка файлов (сопоставить файлы с числами). Тем не менее, меню прокручивается за пределы экрана, поскольку пользовательские параметры вводятся неоднократно, поэтому необходимо настроить цикл.
Самое уродливое меню в мире генерируется автоматически, поэтому я не могу жестко кодировать символы ASCII для рисования линий слева и справа. Нужно ли вызывать программу для переформатирования меню?
Большая часть меню генерируется одной командой bash:
select filename in /usr/local/bin/bell/sounds/*.ogg
Я прочитал руководство Bash на select
Заявление, но не вижу никаких вариантов. Есть ли программа, которую можно вызвать для массажа экрана?
Самая близкая вещь, которую я нашел, называется tput
описано здесь: http://linuxcommand.org/lc3_adv_tput.php, но я не уверен, практично ли это для этой проблемы.
Заранее спасибо:)
PS Это меню является одним из инструментов, позволяющих избавиться от раздражающего звукового сигнала в терминале и gedit
как описано здесь: Отключите звуковой сигнал материнской платы / ПК в регрессии Ubuntu 16.04
Изменить - Включение принятого ответа
Большое спасибо wjandrea за размещение кода для очистки меню. До принятого ответа я добавил код для цвета в echo
Строки и PS3 (подскажите). Я также включил цикл, чтобы перерисовать меню, чтобы оно не прокручивалось за пределы экрана. Я также положил в reset
очистить экран перед перекрашиванием. Это предотвращает одновременное появление новой копии (иногда усеченной) и новой копии меню.
Новый взгляд меню
Цвета не отображаются точно при копировании из текстового вывода терминала и вставке в 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:
Это все, что сейчас появляется на экране. Здесь нет $ sudo bell-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
Меню было переименовано из bell-select-menu
в bell-menu
, Потому что он находится в /usr/local/bin
это нужно вызывать с sudo bell-menu
и комментарии были обновлены, чтобы отразить этот факт.
Немного поработав, самое уродливое в мире меню и теперь стало и приемлемо выглядящим (но не красивым) меню.
1 ответ
Вот как бы я это сделал. Самое важное, что я изменил, - это то, что сценарий перемещается в каталог перед перечислением файлов, и он перечисляет их как их относительный путь вместо их абсолютного пути.
Также я сделал $PS3
значительно меньше; используемый canberra-gtk-play
потому что это предустановлено, где ogg123
нет; и использовал case
утверждение вместо нескольких if
заявления.
Я не мог проверить это, потому что я бегу 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