19 полезных shell-скриптов на все случаи жизни

В одной из предыдущих статей, касавшихся терминала Linux, я говорил о командах, упрощающих жизнь пользователю и системному администратору. В той статье была затронута возможность обращаться к истории команд, что, конечно, удобно. И Linux не был бы собой, если бы не позволял настраивать всё и вся. Посмотрим, как можно улучшить выдаваемую операционной системой историю команд себе на пользу.

Управление дисковой системой

  • Проверьте геометрию диска, установленного на вашем компьютере с помощью fdisk -l. (изучите таблицу разделов вашего жесткого магнитного диска). /sbin/fdisk -l /dev/sda
  • На каком разделе вашего диска имеется область подкачки swap? В разделе sda5 (у вас может быть другой раздел)
  • Определите размер сектора жесткого диска. 512 байт (fdisk -l)
  • Изучите содержимое файла /etc/fstab, определите подходит ли какая-либо запись для монтирования CD-ROM? Если нет, то какая запись в /etc/fstab должна быть? cat /etc/fstab (если такой записи нет, нужно добавить: mount -t iso9660 -r /dev/cdrom /media/cdrom )
  • Выведите информацию об использовании дискового пространства на всех смонтированных блочных устройствах в системе. df -h
  • Получите информацию об использовании дискового пространства домашним каталогом du -sh ~ (s — без информации о подкаталогах)
  • Вариант 2: перенаправляем вывод в файл и отображаем его на экране

    Не всем и не всегда удобно пользоваться операторами > и >>, так как все же лучше когда волнение команд можно наблюдать в реальном времени в окне терминала. В таком случае мы можем воспользоваться командой tee, которая и отобразит выполнение команд на экране, и сохранит его в файл. Синтаксис ее такой:

    команда | tee /путь/к/файлу

    Этот вариант подобен оператору > из предыдущего пункта, то есть при записи в файл, все старые данные будут удалены. Если вам нужно дописать в файл, в конструкцию нужно добавить параметр -a:

    команда | tee -a /путь/к/файлу

    В Bash есть еще несколько операторов и команд, выполняющих идентичные задачи, их часто используют во время написания различных скриптов, но для обычного пользователя, которому нужно сохранить вывод команды чтобы запостить его на форуме, вполне достаточно и этих вариантов. Надеюсь, что помог вам, до новых постов!

    Вариант 2: перенаправляем вывод в файл и отображаем его на экране

    Предыдущая запись Как добавить пользователя в CentOS 7 Следующая запись Восстановление GRUB 2 после установки Windows в DebianМожет вас заинтересовать:

    1. Отключаем чувствительность терминала Linux к регистру при использовании автодополнения по TAB
    2. Как узнать версию дистрибутива и ядра Linux
    3. Как перезагрузить или выключить компьютер из терминала в Ubuntu
    4. Скринкастинг с помощью FFmpeg (avconv) в Linux

    Метки Linux терминалХаки Linux

    Обработка большого количества аргументов командной строки в Bash

    Даже обработка двух флагов сопряжена с трудностями. Качества кода выше значительно ухудшится, если аргументы могут указываться в произвольном порядке. Но даже без этого, для обработки трёх стартовых условий (-a, -c, -o) перед операцией сдвига понадобится проверка всех вариантов. Потом еще раз проверка и сдвиг. И еще раз проверка и сдвиг. Кроме того, пользователи любят комбинировать опции запуска программы между собой. Представьте, как ужасно разбирать на составные части входные данные вида -ac -o или -aco.

    Читайте также:  Кэшбэк в 2019 году: что это, как работает, виды, плюсы и минусы

    Введение в getopt

    Если необходимо создать объёмный сценарий с большим набором опций запуска, то использование программы getopt – одно из лучших решений. С помощью этой утилиты можно легко разобрать на составные части различные флаги и значения, скомбинировать их, а затем обработать удобным способом в одном месте.

    Алгоритм применения getopt выглядит следующим образом:

    1. Разбор существующих аргументов командной строки с помощью getopt. В результате будет создана временная переменная с отсортированными данными по заданному шаблону.
    2. Замена аргументов на новые командой set.
    3. Последовательная обработка полученных значений в цикле.

    Наглядно продемонстрировать эту последовательность действий можно на простом примере. Предположим, что существует скрипт, ход выполнения которого задаётся тремя опциями: -s, -p и –t.

    Вначале необходимо привести аргументы командной строки к структурированному виду командой getopt. Это поможет избавиться от влияния способа ввода данных пользователем:

    args=$(getopt sp:t $*)

    При сравнении с обработкой ошибок (показана ниже) можно заметить, что первый параметр для getopt – это список всех допустимых флагов. С помощью : указывается, что после аргумента следует еще один обязательный.

    Затем можно проверить значение переменной $? – статус выполнения последней операции. Если при обработке утилитой getopt параметров возникла какая-то ошибка, то её значение будет отличаться от 0. В этом случае можно вывести подсказку по использованию программы и завершить выполнение:

    if [ $? != 0 ] ; then echo "Использование: $(basename $0) {-p SFX} {-n} {-t}" echo " -s выводить число подходящих файлов" echo " -p использовать суффикс SFX для имён файлов" echo " -t режим тестирования – не выполнять реальных действий" exit 0 fi

    На практике часто встречаются скрипты, в которых подобная подсказка заключена в отдельную функцию. Так исходный код лучше воспринимается. Следует отдельно отметить выражение $(basename $0) — оно отделяет имя запущенной программы от полного пути к исполняемому файлу.

    После обработки ошибок продолжаем выполнять полезные действия:

    set — $args

    Теперь все аргументы отсортированы и готовы к обработке. Производится она обычно с помощью конструкции case, заключённой в цикл. Выглядит это следующим образом:

    i=0 for i do case "$i" in -s ) flag_s=1 ; shift ;; -p ) flag_p=1 ; sfx=$2 ; shift 2 ;; -t ) flag_t=1 ; shift ;; esac done

    Здесь используется нестандартный синтаксис работы с case. Двойное ; (;;) применяется для завершения последовательности действий для определённого условия. Это выполняет декоративную функцию и упрощает восприятие исходного кода.

    Условные операторы

    Двойные квадратные скобки [[ … ]] bash интерпретирует как один элемент с кодом возврата. Внутри разрешается использование операторов && и ||.

    ## Однострочная запись [[ -f /dir/file ]] || { echo «File not exists»; exit 1; } ## Вложенные условия if [ … ] && [ … ]; then … elif [[ … && … ]]; then … else … fi;

    Пример проверки что переменная не пустая:

    if [[ $some_var != » ]]; then echo ‘Переменная не пустая’ fi

    Читайте также:  CHKDSK Как проверить и исправить ошибки жесткого диска

    Комбинированные условия с отрицанием:

    if [ -f /path/ ] && [ ! -z «$status» ]; then echo «Файл и переменная существуют» else echo «Нет файла или переменной» fi

    Оператор case:

    case «$extension» in (html|htm) echo «Это HTML файл» ;; pdf) echo «Это PDF файл» ;; *) echo «Не известный тип файла: $extension» ;; esac

    Условия сравнения

    Смотрите доп. условия проверки файлов —

    ### Файлы ### -e Проверить что файл существует (-f, -d) -f Файл существует (!-f — не существует) -d Каталог существует -s Файл существует и не пустой -r Файл существует и доступен на чтение -w … на запись -x … на выполнение -h Символическая ссылка -b Файл существует и является блочным устройством -с Файл существует и является символьным устройством (character device) -p Файл существует и является потоковым устройством (pipe device) -S Файл существует и является сокетом ### Строки ### -z Пустая строка -n Не пустая строка == Равно (!= не равно) ### Числа ### -eq Равно -ne Не равно -lt Меньше -le Меньше или равно -gt Больше -ge Больше или равно

    Установка дефолтного значения переменной

    Не работает для массивов!

    Установка значения по умолчанию для аргумента:

    SOME_VAR=${1:-‘default’} # Если первый аргумент ($1) пустой — присвоить строку SOME_VAR=${2:-$default} # Если аргумент $2 пустой — установить значение $default : ${my_var:=$default} # Если $my_var пустая — присвоить ей значение из $default

    Установка дефолтного значения для существующей переменной:

    TEST=’YES’ : ${TEST:=’some string’} echo $TEST # YES

    Десктоп

    Раз уж мы заговорили о десктопе, то продолжим. Как и консоль, его тоже можно заскриптовать. Вот, например, скрипт, загружающий случайные обои, опубликованные на reddit-канале wallpaper:

    #!/bin/bash wget -O — |\ grep -Eo ‘[^&]+jpg’ |\ shuf -n 1 |\ xargs wget -O feh —bg-fill

    Здесь все просто. С помощью wget скрипт загружает страницу , передает ее grep, который ищет на ней ссылки на imgur, выбирает случайную ссылку с помощью shuf, загружает ее опять же с помощью wget и устанавливает в качестве обоев, используя команду feh (это такой миниатюрный просмотрщик изображений, его нужно предварительно установить). Скрипт можно добавить на рабочий стол, и тогда по клику у тебя будут меняться обои.

    #!/bin/sh state=`synclient | grep TouchpadOff | cut -d ‘=’ -f 2` if [ $state = «1» ]; then synclient TouchpadOff=0 else synclient TouchpadOff=1 fi

    А это скрипт для включения/выключения тачпада ноутбука: включает, если отключен, и наоборот. В своей работе использует утилиту synclient, позволяющую управлять тачпадами производства Synaptics (90% тачпадов делают они). При запуске без аргументов утилита выводит различную информацию о тачпаде, в том числе строку TouchpadOff = 1, если он активирован, и TouchpadOff = 2, если отключен. Скрипт находит это значение и в зависимости от состояния тачпада включает или отключает его.

    !#/bin/bash mpv tv:// -frames 3 -vo jpeg mv rm -f 0000*.jpg

    А так можно сделать снимок с помощью веб-камеры. Скрипт использует видеоплеер mpv, чтобы записать первые три кадра, снятые камерой, в JPEG-файлы с именами , , , затем переименовывает третий снимок в файл , а остальные удаляет. Три снимка необходимы для того, чтобы камера успела провести инициализацию, обычно первые два получаются просто черными. Иногда изображение выходит перевернутым; чтобы это исправить, mpv следует запускать с флагом -vf flip:

    Читайте также:  Почему стоит выбрать Linux, а не Windows?

    $ mpv tv:// -frames 3 -vf flip -vo jpeg

    Ту же самую команду можно использовать для создания полноценной камеры слежения, которая делает снимки в моменты, когда юзер прикасается к мыши:

    #!/bin/bash while true; do sudo cat /dev/input/mouse0 | read -n1 mpv tv:// -frames 3 -vo jpeg mv `date +%F-%H-%M`.jpg rm -f 0000*.jpg sleep 10 done

    Скрипт входит в бесконечный цикл, ожидая данные на устройстве /dev/input/mouse0. Если данные есть, значит, мышь сдвинулась или была нажата одна из ее клавиш. После этого он использует mpv, чтобы сделать три снимка, дает третьему снимку имя текущей даты и удаляет остальные.

    Для записи полноценного видео с веб-камеры можно использовать такой скрипт:

    #!/bin/bash mencoder tv:// -tv driver=v4l2:width=800:height=600:device=/dev/video0:fps=30:outfmt=yuy2:forceaudio:alsa:adevice=hw.2,0 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=1800 -ffourcc xvid -oac mp3lame -lameopts cbr=128 -o

    В результате ты получишь в формате MPEG4 с битрейтом 1800 и аудиодорожкой в формате MP3 с битрейтом 128.

    #!/bin/bash ffmpeg -f x11grab -r 25 -s 1366×768 -i :0.0

    А так ты можешь записать скринкаст. 1366×768 — разрешение рабочего стола. Просто сделать скриншот отдельного окна всегда можно с помощью команды import:

    import

    После ее запуска значок мыши изменится на «прицел», с помощью которого можно выбрать окно. Повесив эту команду на клавиатурную комбинацию, ты получишь практически идеальную систему снятия скриншотов, абсолютно не жрущую память, как это делают специализированные приложения, постоянно висящие в трее.

    Подключить и настроить внешний монитор тоже можно из командной строки:

    #!/bin/sh if [ -z «$1» ]; then exit fi if [ $1 == «off» ]; then xrandr —output VGA-0 —off xrandr -s 0 else if [ $1 == «on»]; then xrandr —output LVDS —auto —primary —output VGA-0 —auto —left-of LVDS xrandr —newmode «1920×1080» 1920 2048 2248 2576 1080 1083 1088 1120 -hsync +vsync xrandr —addmode VGA-0 1920×1080 xrandr —output VGA-0 —mode 1920×1080 fi xrandr —dpi 96

    Данный скрипт предполагает, что основной монитор носит имя LVDS, а внешний — VGA-0. Это стандартная ситуация для ноутбуков; если ты не уверен, можешь проверить вывод команды xrandr: при передаче скрипту аргумента off он отключает внешний монитор, аргумент on, в свою очередь, включает его, располагая по левую сторону от основного (аргумент —left-of LVDS в первой команде). Далее скрипт добавляет новую конфигурацию для монитора с разрешением 1920 x 1080 и активирует его. В самом конце скрипт устанавливает дефолтное значение DPI — как показывает практика, при подключении монитора с другим разрешением оно часто слетает.

    На самом деле в большинстве случаев команды xrandr —newmode … и xrandr —addmode … не нужны, так как Xorg может получить конфигурацию монитора и поддерживаемые им разрешения с помощью EDID. Иногда, однако, этого не происходит, и строку конфигурации, указываемую после аргумента —newmode, приходится генерировать самостоятельно с помощью инструмента cvt:

    $ cvt 1920 1080

    Он же поможет сгенерировать нестандартное разрешение, «не поддерживаемое» монитором по умолчанию.