Использование Shebang в оболочке Bash

Доставайте ручки и чистые листы: здесь представлены основы основ по bash для начинающих!

Разбираемся с файлами /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-сценариев.

Разница проста: файл /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/

Читайте также:  Как поднять простейший прокси-сервер на Windows

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

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

Установка и настройка

1) Установить из Google Play или F-Droid

2) Обновить внутренние пакеты

$ apt update && apt upgrade

1 $ apt update && apt upgrade

3) При необходимости, настроить ssh-сервер и подключиться удаленно к оболочке Termux с компьютера (подробнее ниже, а также в статье)

3) При необходимости, настроить панель горячих клавиш и клавиатуру (подробнее ниже)

Установка и настройка

4) Открыть доступ к внешнему хранилищу устройства (подробнее ниже)

5) При необходимости, установить пакет для поддержки команд Termux API (подробнее ниже):

$ pkg install termux-api

6) При необходимости запуска скриптов с помощью дополнения Termux Widget, создать специальные каталоги в домашней директории $HOME и скопировать туда скрипты (подробнее ниже).

7) При необходимости, установить и настроить git с использованием парольной аутентификации к удаленному репозиторию или с помощью ssh-ключей (описание в статье).

Приведем примеры

. (точка)

Используется для соответствия любому символу, который встречается в поисковом запросе. Например, можем использовать точку как:

$ grep «d.g» file1

Это регулярное выражение означает, что мы ищем слово, которое начинается с ‘d’, оканчивается на ‘g’ и может содержать один любой символ в середине файла с именем ‘file1’. Точно так же мы можем использовать символ точки любое количество раз для нашего шаблона поиска, например:

T……h

Этот поисковый термин будет искать слово, которое начинается с ‘T’, оканчивается на ‘h’ и может содержать любые шесть символов в середине.

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

$ grep «N[oen]n» file2

Здесь мы ищем слово, которое начинается с ‘N’, оканчивается на ‘n’ и может иметь только ‘o’, ‘e’ или ‘n’ в середине. В квадратных скобках можно использовать любое количество символов. Мы также можем определить диапазоны, такие как ‘a-e’ или ‘1-18’, как список совпадающих символов в квадратных скобках.

Это похоже на оператор отрицания для регулярных выражений. Использование [^ ] означает, что поиск будет включать в себя все символы, кроме тех, которые указаны в квадратных скобках. Например:

$ grep «St[^1-9]d» file3

Читайте также:  Как дать права root пользователю Linux Ubuntu

Это означает, что у нас могут быть все слова, которые начинаются с ‘St’, оканчиваются буквой ‘d’ и не содержат цифр от 1 до 9.

До сих пор мы использовали примеры регулярных выражений, которые ищут только один символ. Но что делать в иных случаях? Допустим, если требуется найти все слова, которые начинаются или оканчиваются символом или могут содержать любое количество символов в середине. С этой задачей справляются так называемые метасимволы-квантификаторы, определяющие сколько раз может встречаться предшествующее выражение: + * & ?

{n}, {n m}, {n, } или { ,m} также являются примерами других квантификаторов, которые мы можем использовать в терминах регулярных выражений.

* (звездочка)

На следующем примере показано любое количество вхождений буквы ‘k’, включая их отсутствие:

$ grep «lak*» file4

Это означает, что у нас может быть совпадение с ‘lake’ или ‘la’ или ‘lakkkkk’.

Следующий шаблон требует, чтобы хотя бы одно вхождение буквы ‘k’ в строке совпадало:

$ grep «lak+» file5

Здесь буква ‘k’ должна появляться хотя бы один раз, поэтому наши результаты могут быть ‘lake’ или ‘lakkkkk’, но не ‘la’.

В следующем шаблоне результатом будет строка bb или bab:

$ grep «ba?b» file6

С заданным квантификатором ‘?’ мы можем иметь одно вхождение символа или ни одного.

Важное примечание! Предположим, у нас есть регулярное выражение:

$ grep «S.*l» file7

И мы получаем результаты ‘Small’, ‘Silly’, и ещё ‘Susan is a little to play ball’. Но почему мы получили ‘Susan is a little to play ball’, ведь мы искали только слова, а не полное предложение?

Все дело в том, что это предложение удовлетворяет нашим критериям поиска: оно начинается с буквы ‘S’, имеет любое количество символов в середине и заканчивается буквой ‘l’. Итак, что мы можем сделать, чтобы исправить наше регулярное выражение, чтобы в качестве выходных данных мы получали только слова вместо целых предложений.

Для этого в регулярное выражение нужно добавить квантификатор ‘?’:

$ grep «S.*?l» file7

или символ экранирования

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

$ grep «S.*?.» file8

Оно будет искать и сопоставлять все слова, которые заканчиваются точкой.

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

Условия. Множественный выбор

Если необходимо сравнивать какоую-то одну переменную с большим количеством параметров, то целесообразней использовать оператор case.

#!/bin/bash echo "Выберите редатор для запуска:" echo "1 Запуск программы nano" echo "2 Запуск программы vi" echo "3 Запуск программы emacs" echo "4 Выход" read doing #здесь мы читаем в переменную $doing со стандартного ввода case $doing in 1) /usr/bin/nano # если $doing содержит 1, то запустить nano ;; 2) /usr/bin/vi # если $doing содержит 2, то запустить vi ;; 3) /usr/bin/emacs # если $doing содержит 3, то запустить emacs ;; 4) exit 0 ;; *) #если введено с клавиатуры то, что в case не описывается, выполнять следующее: echo "Введено неправильное действие" esac #окончание оператора case.

Читайте также:  Бесплатные облачные сервисы для хранения ваших файлов

Результат работы:

$ ./ Выберите редатор для запуска: 1 Запуск программы nano 2 Запуск программы vi 3 Запуск программы emacs 4 Выход

После выбор цифры и нажатия Enter запуститься тот редактор, который вы выбрали(если конечно все пути указаны правильно, и у вас установлены эти редакторы 🙂 )

Прведу список логических операторв, которые используются для конструкции if-then-else-fi:

-z # строка пуста -n # строка не пуста =, (==) # строки равны != # строки неравны -eq # равно -ne # неравно -lt,(< ) # меньше -le,(<=) # меньше или равно -gt,(>) #больше -ge,(>=) #больше или равно ! #отрицание логического выражения -a,(&&) #логическое «И» -o,(||) # логическое «ИЛИ»

С основами языка и условиями мы разобрались, чтобы не перегружать статью, разобью её на несколько частей(допустим на 3). Во второй части разберем операторы цикла и выполнение математических операций.

Основы BASH. Часть 2.

Потоки

Файл, из которого осуществляется чтение, называется стандартным потоком ввода, а в который осуществляется запись — стандартным потоком вывода.

Стандартные потоки:

0 stdin, ввод 1 stdout, вывод 2 stderr, поток ошибок

При перенаправлении потоков, вы можете указывать ссылки на определенные потоки. Например, перенаправим вывод и ошибки команды в файл:

command 2>&1 # ошибки (stderr) в stdout command > ~/ 2>&1 # stdout в файл command &> ~/ # весь вывод в файл

Перенаправление потоков

Для перенаправления потоков используются основные команды: <, >, >>, <<<, |. Рассмотрим как можно перенаправлять стандартные потоки.

Перенаправление потока вывода:

> перенаправить поток вывода в файл (файл будет создан или перезаписан) >> дописать поток вывода в конец файла

Перенаправление потока ввода (прием данных):

< файл в поток ввода (файл будет источником данных) <<< чтение ОДНОЙ строки вместо содержимого файла (для bash 3 и выше)

Перенаправление вывода ошибок:

2> перенаправить поток ошибок в файл 2>> дописать ошибки в файл (файл будет создан или перезаписан)

Примечание

Если вам нужно захватить вывод команды в переменную и при этом отобразить вывод на экране, используйте tee:

my_var=$(my_ | tee /dev/tty)

Подстановка процессов

Передать процессу команда1 файл (созданный налету канал или файл /dev/fd/…), в котором находятся данные, которые выводит команда2:

команда1 <(команда2)

Примеры

Логировать результат поиска и ошибки:

find . -maxdepth 1 -name ‘*.png’ > ~/ 2> ~/

Эта конструкция позволяет читать из строки как из файла. Демонстрационный пример:

str=’one,two’; tr ‘,’ ‘ ‘ <<<$str

Создаем временный файл и записываем в него поток переданный скрипту:

tmp_file=$(tempfile) # /tmp/fileXXXXXX cat > $tmp_file

А теперь откроем файл в текстовом редакторе с «отвязкой» (отключением) от терминала, подавляем вывод сообщений в терминал:

(sublime-text $tmp_file &) 2> /dev/null > /dev/null