№
Изменение размера поддерживается драйвером терминала, отправляющим процессу сигнал unix SIGWINCH
. Это означает ИЗМЕНЕНИЕ РАЗМЕРА ОКНА. Новый размер можно считать с оконечного устройства.
Если вы посмотрите на список сигналов unix, другого такого сигнала для возможностей терминала нет.
Большинство возможностей терминала определяется переменной окружения TERM
. Поскольку это переменная среды, TERM
не изменяется ни другими процессами, ни ядром...Ядро не пытается выяснить, какой терминал подключен к последовательной линии. Он также не пытается узнать размер терминала; эта функция не реализована в традиционной последовательной линии.
Последовательные линии были разработаны без протокола автоматического -обнаружения. РЕДАКТИРОВАТЬ :абсолютно возможно отключить терминал и подключить другой. Пользователю придется обновить свой TERM
вручную (, а также размер терминалаstty rows 24 cols 80
). Оболочка или любое другое приложение не обнаружит это автоматически.
AIUI, функция изменения размера не соответствует стандарту POSIX. Соответствующие настройки stty
также специально отмечены в man stty
как нестандартизированные. Однако эти возможности предположительно являются общими для всех современных систем -терминалы с фиксированными символами устарели. Большинство переносимых программ написаны с использованием библиотеки ncurses или аналогичной, поэтому точный сигнал (и ioctl для чтения размера )могут различаться.
for dir in ????-??-??--??:??:??/; do
if [[ $dir > "2020-01-05--00:00:00" ]]; then
printf '%s\n' "$dir"
# process "$dir" here
break
fi
done
Приведенный выше скрипт будет перебирать каталоги в текущем каталоге, имена которых соответствуют шаблону ????-??-??--??:??:??
.
Для каждого каталога сравнивается со строкой 2020-01-05--00:00:00
. Если он сортирует после этой строки лексикографически, печатается имя каталога и цикл завершается.
Это работает, поскольку список, полученный в результате расширения имени пути, сортируется в соответствии с текущим порядком сортировки (точно так же, как ls
сортирует список по умолчанию ).
Чтобы скопировать этот каталог в другое место, замените комментарий на что-то вроде
rsync -av "$dir" /somewhere/elsewhere
Ниже приведен сценарий, который берет конкретную строку из своего первого аргумента командной строки и делает то же самое:
#!/bin/bash
for dir in ????-??-??--??:??:??/; do
if [[ $dir > "$1" ]]; then
printf '%s\n' "$dir"
# process "$dir" here
break
fi
done
Тестирование этого с каталогами, которые вы указали:
$ ls -l
total 10
drwxr-xr-x 2 myself wheel 512 Jan 24 11:14 2019-12-04--16:12:56
drwxr-xr-x 2 myself wheel 512 Jan 24 11:14 2019-12-09--13:36:53
drwxr-xr-x 2 myself wheel 512 Jan 24 11:14 2020-01-23--13:24:13
drwxr-xr-x 2 myself wheel 512 Jan 24 11:14 2020-01-23--13:47:03
-rw-r--r-- 1 myself wheel 119 Jan 24 11:23 script.sh
$./script.sh "2020-01-05--00:00:00"
2020-01-23--13:24:13/
Я придумал
$ printf '%s\n' ????-??-??--??:??:?? | awk '$1 > "2020-01-05--00:00:00"{print;exit}'
2020-01-23--13:24:13
Сzsh
:
ref=2020-01-05--00:00:00
list=($ref *(DN/oN)) # list is ref + all directories unsorted
list=(${(o)list}) # sort the list (as per locale collation algorithm)
print -r -- ${list[$list[(ie)$ref] + 1]-none}
(где $array[(ie)string]
расширяется до массива i
ndex элемента, который e
точноstring
).