Você pode definir a variável COLUMNS
para limitar a largura da exibição. Por exemplo, se você defini-la como 12, ela formatará seu exemplo em uma única coluna:
COLUMNS=12
select opt in "${options[@]}"; do
case $REPLY in
1) check_update; break ;;
2) reinstall_theme; break ;;
3) font; break ;;
4) wall; break ;;
5) check_update_tool; break ;;
6) all_done=1; break ;;
*) echo "Invalid option" ;;
esac
produz
===========================
Tool for theme
===========================
Choose an option:
1) Check theme update
2) Reinstall theme
3) Install font
4) Install wallpaper
5) Check tool update
6) Quit
#?
O manual do bash descreve COLUMNS:
Used by the
select
command to determine the terminal width when printing selection lists. Automatically set if thecheckwinsize
option is enabled (see The Shopt Builtin), or in an interactive shell upon receipt of aSIGWINCH
.
Além de ver o recurso na página de manual, é útil ler o código-fonte para obter a história completa. Essa variável é usada na função select_query
, com o comentário
/* Print the elements of LIST, one per line, preceded by an index from 1 to LIST_LEN. Then display PROMPT and wait for the user to enter a number. If the number is between 1 and LIST_LEN, return that selection. If EOF is read, return a null string. If a blank line is entered, or an invalid number is entered, the loop is executed again. */
e mais tarde, na % funçãoselect_query
t = get_string_value ("COLUMNS"); COLS = (t && *t) ? atoi (t) : 80;
Se você der um valor razoável , atoi
dará resultados razoáveis (até mesmo zero, neste caso, seria plausível, já que isso é menos de 80 colunas, e ser retornado por atoi
se você definir COLUMNS
para um valor não numérico). Se não houver valor, (por exemplo, COLUMNS=""
), bash
usará 80 colunas.
Leitura adicional:
-
atoi - converte uma string em um inteiro
The call atoi(str) shall be equivalent to:
(int) strtol(str, (char **)NULL, 10)
-
strtol, strtoll - converte uma string em um inteiro longo
If no conversion could be performed, 0 shall be returned