Изменить ключ, отображающий предыдущие командные строки в ksh

Вы можете использовать блокирующее чтение с тайм-аутом, чтобы определить, когда вывод остановлен. Например, Bash readподдерживает параметр тайм-аута. Следующий скрипт запишет одну строку, если вывод из STDIN остановится более чем на 2 секунды:

#!/bin/sh

while read -r firstline; do
    while read -r -t 2 line; do
        continue
    done
    echo "---- No data in 2 seconds ----"
done

Эхо можно перенаправить -в другой журнал, а сценарий можно изменить, чтобы при необходимости отображать данные, считываемые из стандарта.

3
09.07.2016, 13:07
1 ответ

Большинство учебников, которые вы можете найти, посвящены bash. Ksh очень хорош для написания сценариев, но плох для интерактивного использования. Используйте zsh (лучший) или bash (второй по популярности) в качестве командной строки, если можете.

Сегодня существует две основные реализации ksh: реальная оболочка Korn shell ksh93 и клон mksh (полученный из давно не поддерживаемого pdksh). Они имеют различные средства связывания ключей.

В ksh93 клавиши Вверх и Вниз по умолчанию не перемещаются в истории командной строки. По умолчанию используются клавиши Ctrl+P и Ctrl+N. Вы можете изменить привязки клавиш с помощью ловушки KEYBD; она довольно неуклюжа, поскольку вы можете только переводить клавиши в другие клавиши, а все привязки должны быть определены в одном месте. Вот как заставить Вверх и Вниз перемещаться по истории (этот код вводится в ~/. kshrc):

set -o emacs
function KEYBD_trap {
  case ${.sh.edchar} in
    $'\e'[[O]A) .sh.edchar=$'\e>';;
    $'\e'[[O]B) .sh.edchar=$'\e<';;
  esac
}
trap KEYBD_trap KEYBD

\e[A и \eOA, где \e обозначает ASCII escape character, - это две управляющие последовательности, которые терминал может отправить, когда пользователь нажимает клавишу Вверх (это зависит от терминала и его текущего режима). Аналогично \e[B и \eOB - для Вниз. $'\e - это обозначение, которое вы можете использовать в ksh для символа эвакуации; шаблон [[O] соответствует либо [, либо O.

В mksh вы определяете привязки клавиш с помощью встроенного модуля bind. Вверх и Вниз по умолчанию перемещают по истории (в дополнение к kbd>Ctrl+P и Ctrl+N). Следующий код (который нужно поместить в ~/.mkshrc) отключает клавиши со стрелками:

bind '^[OA'=
bind '^[[A'=
bind '^[OB'=
bind '^[[B'=

^[ - это обозначение, которое вы можете использовать в привязках клавиш mskh для символа escape.

Вся эта информация находится в man-странице оболочки, не обязательно в понятной форме, если вы не знакомы с оболочками Unix.

3
27.01.2020, 21:22

Теги

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