Когда я работаю в linux терминале, то замечаю, что часто набираю date просто, чтобы посмотреть время. Поэтому чтобы сделать жизнь немного проще, я написал скрипт, который всегда показывает часы в правом верхнем углу экрана.
Скрипт сохраняет текущее положение курсора в управляющей ANSI последовательности. После, используя команду tput, курсор отправляется на строку 0 (в верхней части экрана) и последний столбец минус 19 символов (19 это длина HH: MM: SS YYYY-MM-DD). Отформатированная комманда date отображается в инвертированном зеленом цвете. Курсор затем отправляется в первоночальное положение с использованием другой ESC-последовательности.
Если Вы пользуетесь терминалом в X Window, то можете изменять размеры окна и часы будут сохранять свою позицию, поскольку она отображается в последней колонке минус 19 символов. Управляющие ANSI последовательности не работают во всех эмуляторах терминалов, но они хорошо работают в xterm (странно, но я проверил к console и Yakuake, скрипт прекрасно работает — прим. перев.). Вот скрипт:
#!/bin/bash # clock.sh # the script is executed inside a while without conditions while : do # time and date are formatted to show HH:MM:SS YYYY-MM-DD cmd=`date +"%H:%M:%S %F"` # cursor's current position is saved through an escape sequence echo -n -e "33[s" # Uncomment the next two lines to clean up the whole first line, although it causes a lot of blinking #tput cup 0 0 # positions on row 0 col 0 (left top corner) #tput el # cleans from position to end of line # to place the clock on the appropriate column, subtract the length of 'HH:MM:SS YYYY-MM-DD', which is 19, # from the total number of columns C=$((`tput cols` - 19)) tput cup 0 $C # positions cursor at row 0 col $C # clock will be shown green inverted # setaf 2 = green, smso = inverted COLOR=`tput setaf 2; tput smso` # back to normal screen colors NORMAL=`tput sgr0` # print the time-date output on the above position echo -n $COLOR$cmd$NORMAL # restore the cursor to whatever was its previous position echo -n -e "33[u" # script is executed every second sleep 1 done
Сохраните скрипт как clock.sh, chmod — 755, и запустите его ./clock.sh&. Время и дата теперь должны отобразиться в верхнем правом углу вашего окна терминала.
Когда Вы запустите clock.sh, терминал вернет номер задачи и идентификатор процесса (PID), с помощь которого Вы можете завершить работу скрипта командой kill.
С помощью этого скрипта Вы можете отобразить не только часы, но и любую другую информацию какую захотите. Для примера, предположим, что мы хотим наблюдать за нагрузкой процессора командой uptime:
uptime 09:19:56 up 1 day, 1:54, 4 users, load average: 0.29, 0.39, 0.42
Три последних значения и есть загрузка процессора за последнюю минуту, пять и 15 минут. Вы можете извлечь эту информацию используя команду gawk.
uptime | gawk '{print $(NF - 2), $(NF - 1), $NF}' 0.72, 0.54, 0.47
NF это общее количество полей в выводе команды, а $NF — значение последнего поля. В clock.sh замените эту строчку:
cmd=`date +»%H:%M:%S %F»`
на такую:
cmd=`uptime | gawk ‘{print $(NF — 2), $(NF — 1), $NF}’`
или такую, чтобы оставить время и дату:
cmd=`date +»%H:%M:%S %F» ; uptime | gawk ‘{print $(NF — 2), $(NF — 1), $NF}’`
Поскольку длина строки уже не 19, пусть команда wc поможет нам определить отступ. Измените строчку:
C=$((`tput cols` — 19))
на такую:
C=$((`tput cols` — (`echo $cmd | wc -c` — 1) ))
Длина вывода вычисляется с помощью wc -c (-с считает символы в строке, которые были ей перенаправлены). -l отсекает \r в конце вывода $cmd.
Вы также можете отобразить свободное место на определенном разделе командой df, количество пользователей в системе (uptime или w) или количество процессов (ps). Samba, Apache и многие другие серверные приложения имеют статус-команды из которых можно «вытащить» нужную информацию. Используйте свое воображение, чтобы создать собственную модифицированную версию clock.sh.
Источник: CLI Magic: Use ANSI escape sequences to display a clock in your terminal
Перевод: loki. Пожайлуста, оставляйте ссылку на источник и перевод при копировании данного текста.
6 комментариев
24 января, 2008 в 8:42 дп
sakhnik
Замечательно, спасибо! s/33/\e/g и всё работает. Кроме того, оказалось, что xterm и gnome-terminal тоже не пасут задних.
Для остановки можно обойтись и без kill: выводим задачу на передний план командой fg 1, потом прерываем ^c.
24 января, 2008 в 11:01 дп
elrodeo
а не проще ли:
export PS1='[\t] \[33[01;38m\]\u@\h \[33[01;31m\]\W \$ \[33[00m\]’
24 января, 2008 в 11:26 дп
Slava Semushin
Мда.. Автор про zsh с его RPROMPT слышал? Видимо, нет. Либо статья стара..
24 января, 2008 в 12:04 пп
Slava Semushin
P.S. Вот как это делается в zsh, на всякий случай, если кто не знает: http://www.freesource.info/wiki/Altlinux/DotFiles/Shells/Zsh/Sovety#h892-3
26 января, 2008 в 11:23 дп
MX
Чем не устраивают часы прямо в промте командной строки?
foo@mx:~$ export PS1='[\D{%Y-%m-%d} \A]\u@\h:\W\$’
[2008-01-26 13:21]foo@mx:~$
28 января, 2008 в 9:01 дп
loki
sakhnik, спасибо за подсказку о выключении скрипта. Знал о такой штуке, но подзабыл.
elrodeo, Slava Semushin, MX, в некоторых случаях при работе в полноэкранных приложениях в promt’е нет смысла отображать время. Ну да ладно, можно открыть и вторую консоль или еще что, но вот как в промт вывести загрузку системы, или количесво свободного места на диске? Да и zsh (может он и правда лучше bash’a) у меня нет желания пользоваться, пока и bash устраивает.
Для меня этот скрипт в первую очередь интересная возможность манипулирования управляющими последовательностями и хороший пример работы команды tput.