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

Пояснения по конструкциям test , [, [[, ((, и if-then-else

Консоль — удобный и быстрый инструмент управления компьютером. Вводим команду текстом, получаем результат или сообщение об ошибке с указанием в чём ошибка.

Ввод начинается с указания программы (которую вызываем) и может быть дополнен аргументами и ключами, указывающими программе что именно нужно сделать или как нужно работать. Пример с аргументом: ls build/css — вызываем утилиту ls, указываем ключ build/css — будет показано содержимое указанной в аргументе папки. Пример с ключом: git —version — взвываем программу git, передаем ключ —version — будет показана версия программы (если установлена).

Работая с консолью, мы всегда «находимся» в какой-то папке (она указана в приглашении командной строки). Если там написано ~, то мы в папке пользователя (зависит от настроек Windows, чаще всего это C:/Users/ВАШЕИМЯПОЛЬЗОВАТЕЛЯ/), если там /d/projects, мы в папке D:/projects.

Разбираемся с файлами /etc/profile и /etc/bashrc

Павел Соловьёв Full Stack Developer #администрирование 10 сентября, 2015 363

Недавно я столкнулся со следующей проблемой: приложение не сохраняло настройку umask, заданную в профиле root-пользователя, или в файле /etc/profile. Немного разобравшись в вопросе, я понял, что приложение использует только ту настройку umask, которая задана в  /etc/bashrc, не принимая даже те значения, которые являются его же собственными сценариями запуска.

Немного изучив вопрос, я понял, какую функцию выполняют эти файлы, чем они различаются и как они выполняются. Такой вопрос поднимается не часто, поэтому я подумал, что будет полезно рассказать о нем вам.

Для чего нужен файл /etc/profile?

Если вы используете Linux, то вам наверняка знакомы файлы .profile или .bash_profile, размещенные в вашем домашнем каталоге. Эти файлы используются для задания элементов окружения для оболочки пользователя. Таких элементов, как, например, umask, и таких переменных, как PS1 или PATH.

Файл /etc/profile не очень-то отличается от этих файлов. Он используется для задания общесистемных переменных окружения в оболочках пользователя. Иногда это те же переменные, что и в .bash_profile, но этот файл используется для задания первоначальных PATH или PS1 для всех пользователей оболочек системы.

/etc/profile.d

Помимо задания элементов окружения, файл  /etc/profile выполняет сценарии внутри /etc/profile.d/*.sh. Если вы хотите задать свои собственные переменные окружения для всей системы, вам следует поместить свою конфигурацию в сценарий оболочки в  /etc/profile.d.

Для чего нужен файл /etc/bashrc?

Помимо .bash_profile, в своем домашнем каталоге вы также часто будете встречать файл .bashrc. Этот файл предназначен для задания псевдонимов команд и функций, используемых пользователями оболочки bash.

Аналогично тому, как /etc/profile является общесистемной версией  .bash_profile, файл  /etc/bashrc в Red Hat и файл /etc/ в Ubuntu являются общесистемной версией .bashrc.

Стоит отметить, что в Red Hat реализация /etc/bashrc также выполняет сценариий оболочки в /etc/profile.d, но только если пользовательская оболочка является Интерактивной оболочкой (т.е. Login Shell (стартовой оболочкой))

Когда используются эти файлы?

То, когда выполняется каждый из этих файлов, зависит от типа выполняемого логина. В Linux имеется два типа стартовых оболочек (login shells) — Интерактивные оболочки и Неинтерактивные оболочки. Интерактивная оболочка используется, когда пользователь может взаимодействовать с оболочкой, т.е., например, типичное приглашение командной строки bash. Неинтерактивная оболочка используется, когда пользователь не может взаимодействовать с оболочкой, т.е. выполнение bash-сценариев.

Читайте также:  iOS 14: как обновиться до финальной версии?

Разница проста: файл /etc/profile выполняется только для интерактивных оболочек, а файл /etc/bashrc – как для интерактивных, так и для неинтерактивных. Вообще-то, в Ubuntu файл /etc/profile вызывает файл /etc/bashrc напрямую.

Интерактивная оболочка и неинтерактивная оболочка: Сравнение

Чтобы на примере сравнить интерактивную и неинтерактивную оболочки, я добавлю переменную в оба файла /etc/profile и /etc/ в своей Ubuntu.

/etc/profile

grep TEST /etc/profile export TESTPROFILE=1

/etc/

grep TEST /etc/ export TESTBASHRC=1 Интерактивная оболочка

Ниже приведен пример интерактивной оболочки. В этом случае были выполнены оба файла /etc/profile и /etc/

su — env | grep TEST TESTBASHRC=1 TESTPROFILE=1 Неинтерактивная оболочка

В этом примере мы выполняем команду через оболочку SSH, которая является неинтерактивной; поскольку это неинтерактивная оболочка, выполняется только файл /etc/

# ssh localhost «env | grep TEST» [email protected]’s password: TESTBASHRC=1 Заключение

В моем случае приложение не признает значение umask, заданное в файле /etc/profile, но признает значение в файле /etc/bashrc. Это говорит о том, что подпроцесс начинается как неинтерактивная оболочка. Поскольку предлагаемый способ изменения переменных окружения заключается в добавлении сценария оболочки в /etc/profile.d, в моем случае лучше задать значение umask в файле /etc/bashrc.

bash

Об авторе Павел Соловьёв Комментарии Пока что нет комментариев, вы можете быть первым. Войти или Регистрация , чтобы оставлять комментарии.

Основная информация о Find

Find — это одна из наиболее важных и часто используемых утилит системы Linux. Это команда для поиска файлов и каталогов на основе специальных условий. Ее можно использовать в различных обстоятельствах, например, для поиска файлов по разрешениям, владельцам, группам, типу, размеру и другим подобным критериям.

Утилита предустановлена по умолчанию во всех Linux дистрибутивах, поэтому вам не нужно будет устанавливать никаких дополнительных пакетов. Это очень важная находка для тех, кто хочет использовать командную строку наиболее эффективно.

Команда find имеет такой синтаксис:

find [папка] [параметры]критерийшаблон [действие]

Папка— каталог в котором будем искать

Параметры— дополнительные параметры, например, глубина поиска, и т д

Критерий— по какому критерию будем искать: имя, дата создания, права, владелец и т д.

Шаблон — непосредственно значение по которому будем отбирать файлы.

Простые примеры

Итак, не разглагольствуя понапрасну, сразу перейдем к примерам:

$ curl

Эта простая команда покажет тебе внешний IP — идеальный вариант, если в Сеть ты ходишь через роутер. Все, что она делает, — просто обращается к серверу , который возвращает обратно IP-шник одной строкой вместо полноценной веб-страницы.

И да, это вовсе не скрипт, это просто команда, но, чтобы превратить команду в скрипт, достаточно поместить ее в текстовый файл и первой строкой добавить так называемый шебанг, то есть символы #!, за которыми следует имя командного интерпретатора:

#!/bin/bash curl

Далее скрипт сохраняем в каталог ~/bin и назначаем права на исполнение:

$ chmod +x ~/bin/

Теперь его можно вызывать из командной строки командой

Простые примеры

Идем дальше.

#!/bin/sh curl -4

Этот скрипт позволяет получить сводку погоды на четыре дня. Принцип тут такой же, как в случае с

Сводка погоды в консолиДругие статьи в выпуске: Xakep #212. Секреты даркнета

  • Содержание выпуска
  • Подписка на «Хакер»
Читайте также:  Как узнать IP адрес компьютера или ноутбука

#!/bin/sh dig +short txt $

А так можно получить краткое описание чего-либо в Википедии, причем с помощью DNS-запроса вместо обращения к веб-серверу. Кстати, веб-сервер через командную строку тоже очень легко создать:

#!/bin/sh while ( nc -l 80 < > : ) ; do : ; done

Данный скрипт основан на утилите netcat (nc), которую называют швейцарским армейским ножом для сетевых операций. Скрипт запускает цикл, выполняющий команду nc, которая слушает 80-й порт и в ответ на запрос отдает , отправляя переданный запрос в никуда (символ означает noop, то есть пустую операцию).

С помощью простых скриптов и команд можно запросто слушать интернет-радио:

#!/bin/sh mpv —volume=50 -playlist ~/_

Естественно, плей-лист в формате M3U необходимо заранее скачать с сайта радиостанции. Кстати, если запустить MPlayer с аргументом —input-ipc-server=/tmp/mpvsocket, им можно будет управлять, записывая команды в файл. Например, настроить громкость:

echo ‘volume +10’ | socat — /tmp/mpvsocket

Создай два скрипта: один для запуска, другой для остановки радио (со строкой killall mpv), повесь их на рабочий стол и настрой горячие клавиши DE на управление воспроизведением. Вуаля, у тебя готов плеер для интернет-радио, запустить который можно, просто кликнув по иконке на рабочем столе. И он почти не будет расходовать память или занимать трей.

Но отвлечемся от сетевых операций и вернемся к локальным делам.

Простые примеры

#!/bin/sh tar -czf «../${PWD##*/}» .

Это один из моих любимых скриптов. Он создает архив текущего каталога. Особого внимания здесь заслуживает конструкция ${PWD##*/}, которая берет полный путь до текущего каталога (переменная $PWD) и удаляет из него первую часть вплоть до последнего слеша, оставляя, таким образом, только имя самого каталога. Далее к нему добавляется расширение Более подробно о таких конструкциях ты можешь прочитать в man bash.

#!/bin/sh while true; do inotifywait -r -e MODIFY КАТАЛОГ && ТВОЯ_КОМАНДА done

А это уже скрипт, который запускает команду в ответ на изменение файлов в каталоге. Ее можно использовать для множества разных целей, например для автоматического включения плеера при сохранении MP3-файла. Или просто выводить уведомление на десктоп, используя в качестве команды notify-send:

notify-send «Файл изменен»

Особые переменные (Позиционные переменные)

При вызове команды или сценария с аргументами, имя команды и ее аргументы являются позиционными переменными. Позиционными они называются, потому что внутри сценария  обращение к ним происходит по позиции в командной строке. Давайте рассмотрим их на практике:

# Рассмотрим содержимое командного сценария $ cat display_arg #! /bin/bash echo «Имя запущенного сценария: $0» echo «Первые пять аргументов командной строки: $1 $2 $3 $4 $5» echo «Всего аргументов сценария: $#» echo «Все аргументы у запущенного сценария: $*» echo «Если аргументов более 10, то выводим 10 так: ${10}» echo «PID запущенного сценария: $$» sleep 5 &amp; echo «PID последнего процесса, запущенного в фоне: $!» ls display_ echo «Команда ls display_ завершилась статусом: $?» ls display_arg echo «Команда ls display_arg завершилась статусом: $?» # Запустим сценарий $ ./display_arg 1 98 kjk 98 njk88 kjkj 78 kjkj66 jkj k l h Имя запущенного сценария: ./display_arg Первые пять аргументов командной строки: 1 98 kjk 98 njk88 Всего аргументов сценария: 12 Все аргументы у запущенного сценария: 1 98 kjk 98 njk88 kjkj 78 kjkj66 jkj k l h Если аргументов более 10, то выводим 10 так: k PID запущенного сценария: 3316 PID последнего процесса, запущенного в фоне: 3317 ls: невозможно получить доступ к display_: Нет такого файла или каталога Команда ls display_ завершилась статусом: 2 display_arg Команда ls display_arg завершилась статусом: 0 $

Читайте также:  Как включить и отключить Окей Гугл на Андроиде

Из приведенного скрипта видно, что:

хранит имя команды, запустившей сценарий

$1-$n

переменные хранят 1, 2, 3,…n позицию аргументов команды

хранит количество аргументов команды

хранит значение всех аргументов командной строки через пробел

хранит значение всех аргументов командной строки в виде списка

хранит PID запущенного сценария (процесса)

хранит значение PID последнего процесса, запущенного в фоне

Статус выхода запущенной последней программы. Он так же называется кодом условия, кодом возврата. По соглашению, ненулевое значение статусы завершения соответствует значению false и обозначает неудачное завершение процесса. Код выхода равный 0 соответствует true и обозначает успешное завершение программы. (в нашем примере ls display_ завершилось с ошибкой и кодом выхода 2, т.к. файла или каталога display_ не существует)

Действия над переменными 2

Хочу дополнить возможные действия над переменным: сдвиг и инициализация переменных. Опять же, проще будет понять данные действия на практике:

$ cat set_shift #! /bin/bash echo «var1=$1   var2=$2         var3=$3» shift echo «var1=$1   var2=$2         var3=$3» shift echo «var1=$1   var2=$2         var3=$3» shift echo «var1=$1   var2=$2         var3=$3» echo «Посмотрим как присваиваются переменные командой set» set как это присваивается echo «Вот $1 $3 $2» $ ./set_shift mama papa dom var1=mama       var2=papa               var3=dom var1=papa       var2=dom                var3= var1=dom        var2=           var3= var1=   var2=           var3= Посмотрим как присваиваются переменные командой set Вот как присваивается это $

Как видно, команда shift «сдвигает» позиционные параметры, в результате чего параметры «сдвигаются» на одну позицию влево.

X <- $1, $1 <- $2, $2 <- $3, $3 <- $4, и т.д.

Прежний аргумент $1 теряется, но аргумент $0 (имя файла сценария) остается без изменений.

Команда set устанавливает позиционные переменные на основе переданных ей аргументов, разделенных пробелами. Соответственно, команде set возможно передать в виде аргументов и вывод какой-либо команды в виде set $(command). Параметры команды set можно посмотреть тут.

P.S. Забыл указать на такой использования ссылки на переменную в формате $имя_переменной, возможен и такой синтаксис: ${имя_переменной}. Данный синтаксис позволяет объединить переменную с другим текстом. Пример:

server:~# var10=alex server:~# echo $var10ander server:~# echo ${var10}ander alexander

Как видно в примере, при попытке вывести значение переменной $var10ander выводится пустая строка, и правильно, потому что такой переменной нет. при заключении переменной в фигурные скобки — значение переменной объединяется с последующим текстом.

Резюме

На сегодня это все. Думаю представление о том, как работают переменные в bash, я изложил понятно. Желаю вам побольше практики!

Хочу сказать спасибо товарисчу — начальнику бога за некоторые процитированные в статье примеры.

С Уважением, !

Другие материалы в категории основы Linux

  • Текстовый редактор VIM, основы работы
  • ddrescue или спасаем данные с HDD
  • Резервное копирование файлов сайта по ssh
  • Седьмой релиз Debian
  • Использование ramdisk в Linux (ramdisk, ramfs, tmpfs) или препарирование рамдисков
  • SNMP протокол (основы)
  • Установка антивирусного сканера ClamAV на Debian
  • HOWTO использование backports в Debian
  • Конспект установки Debian на сервер
  • SSH сервер на Debian

Теги: bash, Linux, команды, основы