Как bash устанавливает атрибуты tty до и после выполнения команды?

Использование:./count.awk input.txt | column -t -n

#!/usr/bin/gawk -f

{
    dates[$1] = $1;
    events[$2] = $2;
    numbers[$1][$2]++;
}

END {
    num_dates=asort(dates);
    num_events=asort(events);

    for (i = 1; i <= num_events; i++) {
        printf " %s", events[i];
    }
    print "";

    for (i = 1; i <= num_dates; i++ ) {
        printf "%s ", dates[i];
        for (j = 1; j <= num_events; j++) {
            printf "%s ", numbers[dates[i]][events[j]];
        }
        print "";
    }
}

Тестирование:

Вход(сложный для тестирования)

2017-07-30 A
2017-07-30 D
2017-07-29 D
2017-07-30 B
2017-07-28 E
2017-07-30 B
2017-07-30 A
2017-07-30 A
2017-07-30 C
2017-07-31 A
2017-07-31 B
2017-07-31 C
2017-07-31 B 
2017-07-31 C

Выход

            A  B  C  D  E
2017-07-28              1  
2017-07-29           1     
2017-07-30  3  2  1  1     
2017-07-31  1  2  2        
1
18.10.2019, 10:54
1 ответ

Это библиотека редактирования строки readline(3)-, которая обычно статически создается как часть bash, но также используется другими программами.

Каждый раз, когда он начинает читать команду от пользователя, readline сохраняет настройки терминала и переводит терминал в «сырой» режим [1], чтобы он мог обрабатывать перемещение точки вставки вправо и влево, вспоминать команды из истории и т. д. Когда readline(3)возвращает (, например. когда пользователь нажимает Enter ), восстанавливаются исходные настройки терминала. Readline также будет путаться с сигналами, что может привести к некоторому запутанному поведению .

Если вы просматриваете bash, ищите ioctl(TCSETS*)(, который реализует tcsetattr(3)), иioctl(TCGETS)(tcgetattr(3)). Это те же самые функции, которые используются в stty(1). Если вы запустите bash с --noediting, вы увидите, что он не трогает настройки терминала.

[1] не совсем "сырой" режим cfmakeraw(3); вы можете увидеть точные детали здесь . Все эти настройки терминала задокументированы на справочной странице termios(3).

2
27.01.2020, 23:30

Теги

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