Динамическая переменная в скрипте KornShell

Я сделал такие приемы в системе сборки встроенного дистрибутива Linux. В моем случае это немного отличалось. Сценарий сборки ограничил регион прокрутки (через escape-последовательности VT100) так, чтобы журнал показали в вершине N-4 строки терминала. Нижняя часть четыре строки были превращены в статическую область, которая была обновлена с прогрессом сборки: что в настоящее время создает, прогресс процента и такой.

Путь достигает того, что Вы ищете, это:

  1. Переместите курсор в нижний ряд терминала.
  2. Распечатайте десять пустых строк для прокрутки далеко любого существующего материала.
  3. Установите регион прокрутки на нижнюю часть десять строк.
  4. Выполните команду.
  5. Сбросьте регион прокрутки.

Escape-последовательности могут быть найдены в многочисленных ссылках.

Следующее - что-то, что я просто разбил. Это работает с ударом на VM Ubuntu, который я имею здесь. Это полагается $(( ... )) арифметика, и stty поддержка -g сохранять tty настройки в сериализированной строке. Я избегал использования \e в printf обозначить символ ESC, который сделал бы это менее портативное.

Мы опрашиваем количество строк от терминала потому что LINES переменная не могла бы быть экспортирована. (Мы могли вместо этого проанализировать rows параметр от вывода stty -a; затем мы могли избежать целого танца помещения tty в режиме без предварительной обработки и получения использования ответа эмулятора терминала dd. С другой стороны, этот метод работает даже если rows значение от tty драйвера является неправильным.)

Сохраните этот сценарий как, скажите last10, сделайте это исполняемым файлом и затем попробуйте, например, last10 find /etc.

#!/bin/bash

# save tty settings
saved_stty=$(stty -g)

restore()
{
  stty $saved_stty
  # reset scrolling region
  printf "\033[1;${rows}r"

  # move to bottom of display
  printf "\033[999;1H"
}

trap restore int term exit

# move to bottom of display
printf "\033[999;1H"

printf "\n\n\n\n\n\n\n\n\n\n"

# Query the actual cursor position
printf "\033[6n"

# read tty response
tty_response=
stty raw isig -echo
while true; do
    char=$(dd bs=1 count=1 2> /dev/null)
    if [ "$char" = "R" ] ; then
        break;
    fi
    tty_response="$tty_response$char"
done
stty $saved_stty

# parse tty_response
get_size()
{
   cols=$3
   rows=$2
}

save_IFS=$IFS
IFS='[;R'
get_size $tty_response
IFS=$save_IFS

# set scrolling region to 10 lines
printf "\033[$((rows-9));${rows}r"

# move to bottom of display
printf "\033[999;1H"

# run command
"$@"
2
28.07.2015, 19:13
1 ответ

Для ksh93 у вас есть (как минимум) несколько вариантов

  1. ассоциативных массивов

     envir = Dev 
    foo ["$ envir"] = bar 
    echo "$ { foo ["$ envir"]} "
     
  2. namerefs

     nameref var = $ {envir} foo 
    var = bar 
    echo" $ var "{{1 }} 

Для ksh88 вы можете застрять с eval:

envir=Dev
name="${envir}foo"
eval "$name=bar"
eval "echo \$$name"
3
27.01.2020, 22:05

Теги

Похожие вопросы