Получить статус терминала для возможностей termcap

Это решение простое для понимания, но немного более сложное, поэтому я показываю его в виде шелл-скрипта.

  • преобразовать в «секунды с 1970 года -01 -01 00 :00 :00 UTC»
  • добавить или вычесть разницу
  • преобразовать обратно в удобочитаемый формат с помощью окончательной dateкомандной строки

Шеллскрипт:

#!/bin/bash

startdate="2018-12-10 00:00:00"

ddif="0"          # days
diff="-5:-20:-5"  # hours:minutes:seconds

#-----------------------------------------------------------------------------

ss1970in=$(date -d "$startdate" "+%s")  # seconds since 1970-01-01 00:00:00 UTC
printf "%11s\n" "$ss1970in"

h=${diff%%:*}
m=${diff#*:}
m=${m%:*}
s=${diff##*:}
difs=$(( (((ddif*24+h)*60)+m)*60+s ))
printf "%11s\n" "$difs"

ss1970ut=$((ss1970in + difs))  # add/subtract the time difference
printf "%11s\n" "$ss1970ut"

date -d "@$ss1970ut" "+%Y-%m-%d %H:%M:%S"
2
26.01.2021, 16:14
2 ответа

На эмуляторах терминала, которые его поддерживают, вы можете использовать \033[?7$pescape («Запросить приватный режим DEC» )для запроса этого параметра(7=> Автоматический -режим переноса):

decrqm()(
    exec </dev/tty
    t=$(stty -g)
    trap 'stty "$t"; return' EXIT QUIT INT TERM
    stty -icanon -echo time 1 min 0
    e=$(printf '\033')
    printf "${e}[$1\$p" >/dev/tty
    case $(dd count=1 2>/dev/null) in
    "${e}[$1;1\$y") echo on;;
    "${e}[$1;2\$y") echo off;;
    *) echo unknown;;
    esac
)

$ tput smam  # printf '\033[?7h'
$ decrqm '?7'
on
$ tput rmam  # printf '\033[?7l'
$ decrqm '?7'
off

Лучшим подходом было бы сохранить эту настройку при запуске скрипта с помощью \033[?7sи восстановить ее после выхода с помощью\033[?7r:

save_am(){ printf '\033[?7s'; }
restore_am(){ printf '\033[?7r'; }

save_am
tput rmam
..
restore_am

Но многие эмуляторы терминала (, особенно screenи tmux), не поддерживают эти escape-последовательности. По крайней мере, не по умолчанию. Так что все это пустые пустяки --, не похоже, что вы можете использовать это для чего-то практического;-)

5
18.03.2021, 22:34

Чрезвычайно некрасиво, но хак для обнаружения:

#!/bin/bash

# Detect smam / rmam by printing COLUMNS characters and 
# checking cursor line before and after.

smam()
(
    local -i smam r1 r2 cw
    exec </dev/tty
    local t=$(stty -g)
    trap 'stty "$t"; return' EXIT QUIT INT TERM
    stty -icanon -echo time 1 min 0

    # Terminal width + 1
    (( cw = $(tput cols) + 1 ))

    # Create a blank line and go back up (in case we are at bottom)
    printf "\n"
    tput cuu1
    # Get cursor row 1
    printf "\x1b[6n" >/dev/tty
    r1=$(dd count=1 2>/dev/null | sed 's/\x1b\[\(.*\);.*/\1/')
    # Print columns + 1 spaces
    for ((i = 0; i < cw; ++i)); do printf " "; done
    # Get cursor row 2 AND go to start of line
    printf "\x1b[6n\r" >/dev/tty
    r2=$(dd count=1 2>/dev/null | sed 's/\x1b\[\(.*\);.*/\1/')

    # smam is true if we are at a higher line number
    (( smam = r2 - r1 ))
    # Clear line
    tput el
    # If smam clear line we started on as well
    (( smam )) && tput cuu1 && tput el
    # Optional debug check 
    # printf "%d %d\n" $x1 $x2
    return $(( smam ^ 1 ))
)

# example:

smam && echo smam || echo rmam


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

0
18.03.2021, 22:34

Теги

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