Как стать автором
Обновить

Комментарии 48

echo -n "$(tput hpa $(tput cols))$(tput cub 6)[OK]"

Можете объяснить что это за уличная магия?
tput hpa N — сдвиг курсора на N позиций
tput cols получает ширину окна терминала
tput cub 6 — сдвигает курсор на 6 позиций влево

Таким образом [OK] прижимается к краю.
Спасибо
Если ты используешь tput для указания положения текста, то почему бы им же не выставлять цвет текста, вместо эскейп-кодов?
tput setaf 0..7 — цвет текста
tput setab 0..7 — цвет фона
tput srg0 — сброс на дефолтный
И другие опции
Простите ошибочка
tput sgr0 — сброс на дефолтный
хреново читаю. уже есть: )
"Изучаем tput"
tput cols — получение числа колонок на устройстве вывода
tput hpa _ — передвинуть курсор в позицию __
$(tput hpa $(tput cols) — передвинуть курсор в конец строки
tput cub 6 — сдвинуть курсор влево на 6 знаков.

Вне зависимости от размера экрана, курсор позиционируется на 6 символов от правого края. Потом печатается нужный текст.
И вам спасибо:)
А ещё хотелось бы знать, во всех ли системах есть команда tput, насколько она стабильна и т.п. А то по прошествии года университетские лабораторки почему-то не запустились — обновление что-то сломало…
Авторитетным источником выступить не смогу, но из строчки "tput is a standard Unix operating system command which is used to set terminal features" можно сделать вывод, что эта команда присутствует и во всех *nix системах и стабильна.
Может ещё зависеть от (настроек) терминала, видимо. Живой пример — tput cols, cub и cup работает, а tput hpa — нет.
НЛО прилетело и опубликовало эту надпись здесь
Спасибо. В следующей части расскажу. А еще про нотиферы и звуковое оповещение. Есть еще пожелания?
>rm test_file || ok=0

есть же $? — статус выполнения последней команды.

кроме того, скрипт из примера съедает ошибку и в своем коде возврата всегда возвращает 0, типа ничего и не было.
Действительно, исправил. Спасибо.
Просто на практике мне приходилось анализировать сразу несколько команд, и там предыдущий вариант казался логичным. Про $? я и не подумал даже.
whiptail забыли. там же такие красивые менюшечки ((:
whiptail --title Habr --checklist "Simple checkbox menu" 12 35 3 $(echo {hello,habra,habr}" '' 0" )
Можно сказать, что не забыл. Помните, в статье я рассказывал про dialog. А теперь фокус… Заменяем whiptail на dialog:
dialog --title Habr --checklist «Simple checkbox menu» 12 35 3 $(echo {hello,habra,habr}" '' 0" )
И смотрим, что получилось :)
Ну все же один на ncurses основан, а другой на newt и slang.
Хотя разница, с точки зрения пользователя, не так уж и велика.
Хорошо, спасибо. Напишу в статье, что существует альтернатива.
Тут еще можно поспорить, кто кому альтернативой является: зачастую whiptail установлен в дефолтной системе, а вот dialog еще ставить надо.
Есть еще getopts. Когда надо передать различные параметры и ключи, удобнее чем через ${1-9}
О, вот про что я забыл! Спасибо.
Ни слова про функции, думаю это фундаментально.
А также ничего про то как включить файл конфигурации, хотя про него сказано. Для быстрого справочника который Вы пытаетесь сделать, думаю информация была бы уместной.
Про функции я хотел упомянуть, когда буду рассказывать про getopts. Про включение файла конфигурации вставлю. Хотя я больше интерфейсы хотел рассмотреть. Их применение программистом может быть очень разное.
НЛО прилетело и опубликовало эту надпись здесь
Материал интересный, но продолжение нужно обязательно, т.к. есть еще много нераскрытых моментов, как например (заметили уже) — функции.

Нашел свой скрипт, на котором немного изучил bash. Он помогает обновлять систему на машине без интернета, с помощью обычной флешки: сначала создаётся список пакетов, на другой машине (с интернетом) они закачиваются, потом на первой машине устанавливаются.
Там есть примеры взаимодействия с пользователем, функции, всяческие условия-циклы, использование других утилит (gpg в частности), комменты и сообщения на русском, короче, вдруг пригодится кому:

dl.dropbox.com/u/22991016/updates.sh
Спасибо за примеры!!!
ncurses я не увидел тут
Как видите, явным недостатком этого метода является привязанность к конкретной среде рабочего стола. Да и вообще к графической среде, которая может и отсутствовать. Но, тем не менее, может и пригодиться когда-нибудь.

Можно в скрипте анализировать переменную окружения DESKTOP_SESSION. Различать GNOME, KDE, какую-то другую (переменная определена, но не равна ни GNOME, ни KDE) и текстовую консоль (переменная не определена) для того, чтобы выбрать gdialog/zenity (думаю стоит указать, что zenity это обновленный gdialog, доступный в GNOME уже давно), kdialog, dialog.

Пытался в свое время найти какой-то стандартный способ определения в скриптах не только среды исполнения, но и пользовательских предпочтений — не смог. Может кто знает?
Я не сталкивался с необходимостью использования GUI в скриптах. Да и неправильно это как-то. Консольный вывод привычнее.
Кому привычней, а кому нет. Да и задача может стоять как создание GUI приложения, являющегося по сути враппером к CLI инструментам. Неужели разрабатывать полноценное приложение на Сях, питоне или, прости господи, PHP?
> source ./config.cfg
. config.cfg

:)
А если скрипт запускается из левой директории можно делать так:
MyDir=`cd -P "$(dirname "$0")" && pwd`

. "$MyDir"/config.cfg

Да, . config.cfg проще и удобнее, но source ./config.cfg нагляднее (:

Но вот не пойму зачем:
MyDir=`cd -P "$(dirname "$0")" && pwd`
. "$MyDir"/config.cfg


Разве . config.cfg не всегда сработает?
Не сработает, если скрипт запущен из другой рабочей директории.
Либо я чего-то не догоняю, либо одно из двух. Команда cd -P "$(dirname "$0")" && pwd указывает в ту директорию, их которой запущен скрипт. А значит дает тот же результат, что и . config.cfg. Так ведь?
Ох блин…
Ок, на примере :)
Скрипт у нас лежит в /root, называется допустим script.sh.
Находясь в директории /root вызываем /root/script.sh — все ок.
Находясь в любой другой директории вызываем /root/script.sh — получаем ошибку о том что не найден config.cfg.
cd -P "$(dirname "$0")" && pwd меняет директорию на ту, где расположен скрипт, а не откуда он запущен, таким образом позволяя подгрузить конфиг. Пишу ее в переменную MyDir я для того, чтобы если что иметь возможность переключаться между директориями. Развивая тему:

# определяем рабочую директорию
WorkDir=`pwd`

# определяем директорию где расположен скрипт с конфигом и возвращаемся обратно
MyDir=`cd -P "$(dirname "$0")" && pwd && cd "$WorkDir"`

# читаем конфиг
. "$MyDir"/config.cfg

# далее выполняем всю работу как обычно, в текущей рабочей папке
Понял, спасибо :)
Гуястам:
xmessage -buttons Yes:0,No:1 -default Yes 'Are you sure?'

xmessage, правда, дистроспецифичен. С недавнего времени наличие иксов в арчике не подразумевает автоматически его наличия.

Ну а если делать красиво, то, видимо, анализировать $DESKTOP_SESSION и в зависимости от его значения вызывать kdialog/gdialog
НЛО прилетело и опубликовало эту надпись здесь
А если пишем скрипт установки какой-нибудь игрушки? Юникс не только для серверов!
Паковать в deb/rpm/etc
Не надо вот этих вот скриптов установки.
А если политика партии требует устанавливать только для текущего пользователя, в $HOME? Причём дело может быть не только в копирастии, но и в желании не требовать для неё прав супер пользователя.
Тогда зачем вам вообще инсталлятор?
Пакуйте игру в архив, пользователь распакует где захочет и запустит там же.
НЛО прилетело и опубликовало эту надпись здесь
Это не совсем оболочки. Я хотел публиковать в интерфейсы, но тогда кармы не хватило. Хотя сейчас думаю, что *nix все-таки более подходящий блог. Можно считать два последних заголовка приложением.
В любом случае, полезно иметь на счету такие инструменты, как GUI. Есть пользователи, которые панически боятся консоль. Или захочется получить эстетическое удовольствие.
А вообще, GUI будет полезен, если скрипт автостартует с графической оболочкой.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации