Ctrl-Backspace и Ctrl-Delete в bash

Проблема заключалась в следующем:

# Remove files older than 7 days
find $BACKUPDIR/{directories,databases,logs} -mtime +8 -exec rm {} \;

Отсутствовал -rf после rm . Похоже, это привело к зависанию сценария.

Теперь все работает нормально. Вот полная версия ниже:

#!/bin/bash

# Set local directory variables
NOW=$(date +"%F_%H:%M") # year-month-day_hour:minute format
BACKUPDIR="/home/deploy/backups"
LOGDIR="$BACKUPDIR/logs"
DBDIR="$BACKUPDIR/databases"
LOGFILE="$LOGDIR/$NOW.db_bkup.log"

# check that BACKUPDIR exists
if [ ! -d $BACKUPDIR ]; then
  mkdir -p $BACKUPDIR/{databases,logs}
else
  :
fi

# Set remote directory variables
BKUPSSH="deploy@server.com"
BKUPSERVDIR="/home/deploy/backups/$HOSTNAME/databases"

exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>$LOGFILE 2>&1
# Everything below will go to the file 'db_bkup.log'

# DO NOT BACKUP these databases
IGNOREDB="
information_schema
performance_schema
mysql
test"

#* MySQL binaries *#
MYSQLDUMP=$(which mysqldump)
GZIP=$(which gzip)

# Remove files older than 7 days
find $DBDIR -mtime +8 -exec rm -rf {} \;

# get all database listing
DBS="$(mysql --login-path=dbbkup -Bse 'show databases')"

# start to dump database one by one
for db in $DBS
do
        DUMP="yes";
        if [ "$IGNOREDB" != "" ]; then
                for i in $IGNOREDB # Store all value of $IGNOREDB ON i
                do
                        if [ "$db" == "$i" ]; then # If result of $DBS(db) is equal to $IGNOREDB(i) then
                                DUMP="NO";         # SET value of DUMP to "no"
                                #echo "$i database is being ignored!";
                        fi
                done
        fi

        if [ "$DUMP" == "yes" ]; then # If value of DUMP is "yes" then backup database
                FILE="$DBDIR/$NOW-$db.sql.gz";
                echo "BACKING UP $db";
        $MYSQLDUMP --login-path=dbbkup --add-drop-database --single-transaction --triggers --routines --events --set-gtid-purged=OFF --verbose $db | $GZIP > $FILE
        fi
done

# change permissions on files
chmod -R 755 $BACKUPDIR

# rsync backup to 'Larry' the backup server and append the log file
rsync -azvh $DBDIR/ -e ssh $BKUPSSH:$BKUPSERVDIR
RESULT="$?"

# check result of rsync db's
if [ "$RESULT" != "0" ]; then
    echo -e "rsync exit Code:" $RESULT "\nFAILED to rsync databases"
else
    echo "SUCCESSFULL rsync of databases"
fi
14
24.05.2016, 15:43
4 ответа

Здесь задействованы два строковых редактора: основной строковый редактор, предоставляемый ядром (строковый редактор tty в каноническом режиме), и строковый редактор bash (реализованный через библиотека readline). Оба они имеют команду стирания до предыдущего слова, которая по умолчанию привязана к Ctrl + W . Ключ может быть настроен для редактора строки tty в каноническом режиме через stty werase ; bash имитирует привязку клавиш, которую он находит в настройке tty, если она не переопределена в собственной конфигурации.

Действие werase в редакторе tty-линии настроить невозможно. Он всегда стирает (ASCII) слова, разделенные пробелами. Редко можно взаимодействовать с редактором строки tty - это то, что вы получаете, например. когда вы набираете cat без аргументов.Если вам нужны причудливые привязки клавиш, вы можете запустить команду с помощью такого инструмента, как rlwrap , который использует строку чтения.

Bash предоставляет две команды для удаления предыдущего слова : unix-word-rubout ( Ctrl + w или как задано через stty werase ) и backward-kill-word ( M-DEL , т.е. Esc Backspace ), которые обрабатывает слово как последовательность буквенно-цифровых символов в текущей локали и _ . Если вы хотите Ctrl + Backspace , чтобы стереть предыдущую последовательность буквенно-цифровых символов, не устанавливайте stty werase , а вместо этого поместите следующую строку в свой ] .inputrc :

"\C-h": backward-kill-word

Обратите внимание, что здесь предполагается, что ваш терминал отправляет символ Ctrl + H для Ctrl + Backspace . К сожалению, это один из тех ключей без стандартной привязки (и Backspace в частности представляет собой беспорядок по историческим причинам).

Также есть симметричная команда kill-word , которая по умолчанию привязана к M-d ( Alt + D ). Чтобы привязать его к Ctrl + Delete , вам сначала нужно выяснить, какую escape-последовательность отправляет ваш терминал, а затем добавить соответствующую строку в свой .inputrc .Введите Ctrl + V , затем Ctrl + Удалить ; это вставит что-то вроде ^ [[3; 5 ~ ], где начальное ^ [ является визуальным представлением escape-символа. Тогда привязка будет

"\e[3;5~": kill-word

. Если вас не устраивает какое-либо определение слова, вы можете указать свое собственное в bash: см. запутанное поведение привязок клавиш в стиле emacs в bash

43
27.01.2020, 19:50

Поведение символа WERASE при обработке терминала в готовом режиме жестко запрограммировано , по крайней мере, в Linux:

           if (kill_type == WERASE) {
                   /* Equivalent to BSD's ALTWERASE. */
                   if (isalnum(c) || c == '_')
                           seen_alnums++;
                   else if (seen_alnums)
                           break;
           }

Таким образом, слова представляют собой буквы, цифры и подчеркивание. Так будет всегда в терминале Linux, когда приложение, которое выполняет свою собственную обработку в режиме готовой обработки, не работает.

версия readline (используемая bash и другими), кажется, немного отличается от версии ядра, но также кажется жестко запрограммированной :

Слова состоят из букв и цифр.

Но это не похоже на то, что bash на самом деле делает для меня: foo + bar ^ W стирает все, а не только bar . Более подробная информация об этом находится здесь .

1
27.01.2020, 19:50

Попробуйте

альт + забой

В elementary OS это работает так, как вы хотите (так же, как ctrl + backspace)

10
27.01.2020, 19:50

Вы можете использовать AutoKey с «Фильтром окна», соответствующим вашему терминальному приложению, чтобы ловить Ctrl + Backspace и делать с ним что угодно.

Например, вместо этого выполните keyboard.send_keys("<ctrl>+w").

autokey1

0
16.09.2021, 06:07

Теги

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