Это решение простое для понимания, но немного более сложное, поэтому я показываю его в виде шелл-скрипта.
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"
На эмуляторах терминала, которые его поддерживают, вы можете использовать \033[?7$p
escape («Запросить приватный режим 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-последовательности. По крайней мере, не по умолчанию. Так что все это пустые пустяки --, не похоже, что вы можете использовать это для чего-то практического;-)
Чрезвычайно некрасиво, но хак для обнаружения:
#!/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
Одна из особенностей заключается в том, что при вызове нужно быть на новой линии.