Где задокументировано, что "\e" обозначает клавишу Alt в .inputrc

Реализация описания @Krzysztof Stasiak может быть такой.

Сначала создайте несколько тестовых каталогов:

cd /backup
mkdir Full/20170{1,7}02
mkdir Incremental/2017010{1..9}
mkdir Incremental/2017070{1..9}

И сценарий:

#! /bin/bash
cd /backup
for P in Full Incremental; do
    cd $P
    for D in *; do
        [ $(date -d '-90 days' +%Y%m%d) -gt $D ] && rm -rf $D
    done
    cd..
done

Для проверки вы можете поставить echoперед rm, чтобы увидеть, что будет сделано, но не делая этого.

Здесь мы просто cdпереходим в главный каталог и запускаем циклfor-для двух каталогов:

cd /backup
for P in Full Incremental; do

затем перейдите в каталог "periode":

cd $P

затем выполните forцикл по всем каталогам:

for D in *; do

если сегодня минус 90 дней больше -, чем -gtкаталог$D:

[ $(date -d '-90 days' +%Y%m%d) -gt $D ]

, затем удалите каталог:

&& rm -rf $D

Вы также можете написать это как:

if [ $(date -d '-90 days' +%Y%m%d) -gt $D ]; then
  rm -rf $D
fi

Рассмотрите возможность использования стандартного программного обеспечения для резервного копирования. Это может быть Бакула.

2
23.09.2019, 21:43
2 ответа

Преобразование ключа AltвEscape(ASCII 033,"\e")выполняется вашим эмулятором терминала, библиотека readline (, которая обрабатывает ~/.inputrc), не участвует в этом.

Проблема в том, что нет способа отправить фактические события клавиш в программу, работающую в терминале; терминал преобразует их в последовательности байтов, которые программа может прочитать с tty.

Для клавиши Alt/Meta есть два способа сделать это:

  1. Сопоставьте его с Escape (ASCII 033 / 0x1b)--нажатие Alt-Kфактически отправит "\ek",Alt-Shift-K"\eK"и т. д. Это значение по умолчанию в большинстве эмуляторов терминала, но обычно оно настраивается, и у вас есть все причины, чтобы сделать его по умолчанию, если это уже не так.

  2. Включите старший 7-й бит значения ASCII клавиши --. Нажатие Alt-Kфактически отправит байт 0x6b | 0x80 = 0xeb, где 0x6bявляется значением ASCII "k".

Именно последний распознается как "\M-k"в привязках readline.

И это не работает и ужасно нарушается с любыми многобайтовыми локалями, такими как en_US.UTF-8(, которые используются по умолчанию в большинстве современных систем ). В такой системе эмулятор терминала может не отправлять необработанный 0xebбайт (, который не является допустимой последовательностью UTF -8, а является двоичным мусором ), но может преобразовать его из ISO -8859 -. ] 1 в UTF -8, что приводит к отправке"\xc3\xab" = "ë"(eс диэрезисом )при нажатии Alt-K.

Но readline не знает, как сопоставить "ë"обратно с "\M-k", сколько бы вы ни возились с множеством опций, таких как convert-meta, enable-meta-key, input-metaи т. д.

И даже если бы вы могли это сделать, это все равно было бы сломано, потому что люди могут на самом деле захотеть ввести "ë"и "ó"и не оценят, что они обрабатываются как несвязанные ключи, такие как Alt-Kи Alt-S.

7
27.01.2020, 21:51

Вы должны обнаружить, что \e— это экранирующий символ (, что означает, что есть только один из них, код символа 27, часто пишется как ESC), а не как экранирующий символ . (означает один из нескольких ).

Я думаю, что в данном случае документация пытается сказать, что \eпредставляет экземпляр символа ESC, так что можно было бы написать \e\eдля двух символов ESC.

Он не представляет ALT.

3
27.01.2020, 21:51

Теги

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