Прокачай терминал! Полезные трюки, которые сделают тебя гуру консоли

Список встроенных команд оболочки bash можно получить по команде help или найти на man-странице в секции SHELL BUILTIN COMMANDS.

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

Читайте также:  Как создавать и удалять файлы или каталоги в Линукс

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

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

Команды в Git Bash консоли

clear — Очистить консоль

pwd — Показать текущий каталог ls — Показать файлы в данной папке, кроме скрытых ls -f — Показать файлы в данной папке, включая и скрытые cd c:/ — Перейти в конкретный каталог cd — — Вернуться назад cd .. — Выйти на 1 уровень вверх cd ../.. — Выйти на 2 уровня вверх

Создание каталогов

mkdir — Создать папку cd !$ — Перейти в только что созданную папку mkdir -p {app1,app2} — Создать сразу несколько папок mkdir -p app/{css,js} — Создать сразу несколько вложенных папок

Создание файлов

touch — Создать файл touch app/{css/,js/,} — Создать сразу несколько файлов, никаких лишних пробелов быть не должно

Удаление файлов

touch — позволяет создавать файлы rm test — Удалить пустую папку test rm -r test — Удалить папку test с файлами внутри неё

Перемещение файлов

mv app1/*.* app2 — Переместить все файлы из папки app1 в папку app2

в bash их особенности и область видимости

Типы переменных

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

Глобальные переменные или переменные среды окружения -доступны во всех оболочках. Чтобы показать переменные среды окружения, можно использовать команды env или printenv. Эти команды поставляются в составе пакета sh-utils.

Локальные переменные доступны только в текущей командной оболочке. Если встроенная команда set используется без каких-либо параметров, то она выдаст список всех переменных (в том числе переменные среды исполнения) и функций. Воспользуемся форматированием и выдадим отсортированный результат, учитывающий локальность переменных.

Деление переменных по их содержимому

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

Строковые переменные

Целочисленные переменные

Переменные — константы

Переменные — массивы

Создание переменных

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

12. Ввод/вывод

Ввод-вывод

echo

выводит выражение или содержимое переменной (на stdout)

printf

команда форматированного вывода, расширенный вариант команды echo

read

«читает» значение переменной со стандартного ввода (stdin), в интерактивном режиме это клавиатура

Читайте также:  Как использовать историю Bash в терминале Linux или MacOS

Мигрируем на ZSH

Первое, что стоит сделать перед началом прокачки скиллов, — это избавиться от bash. Не потому, что он плохой или устаревший, а потому, что существует ZSH. Он неиллюзорно повысит твою продуктивность.

ZSH — очень сложный и комплексный командный интерпретатор. Полное руководство ZSH насчитывает около 800 страниц, а абсолютно все его функции, наверное, не знает никто. Но этого ни от кого и не требуют. На свете уже несколько лет существует проект oh-my-zsh, где пользователи создают набор скриптов, с помощью которых можно твикать и настраивать ZSH быстро и легко.

Чтобы получить стандартный набор твиков и настроек, включая мощный механизм автодополнения, информативное приглашение к вводу команды, настройки, повышающие удобство работы с ZSH, достаточно просто установить oh-my-zsh. Далее его можно обвешать плагинами для большего удобства работы с разными приложениями и поменять тему приглашения на любую из десятков, созданных пользователями.

Мигрируем на ZSH

Итак, для начала устанавливаем ZSH:

$ sudo apt-get install zsh

А затем скачиваем и устанавливаем oh-my-zsh:

$ sh -c «$(curl -fsSL -my-zsh/master/tools/)»

Скрипт установки клонирует git-репозиторий в каталог /home/username/.oh-my-zsh, добавит необходимые правки для вызова нужных скриптов в конфиг /home/username/.zshrc и запустит ZSH.

Мигрируем на ZSH

Устанавливаем oh-my-zshРекомендуем почитать: Xakep #262. ROPETWO

  • Содержание выпуска
  • Подписка на «Хакер»

Теперь необходимо сделать ZSH шеллом по умолчанию:

$ sudo usermod -s /usr/bin/zsh имя_юзера

И перелогиниться, чтобы эмулятор терминала использовал ZSH в качестве дефолтового шелла. В качестве опционального шага ты можешь изменить тему. В комплект oh-my-zsh входит огромное количество тем, ознакомиться с которыми можно на wiki-странице. Чтобы выбрать новую тему, исправь значение переменной ZSH_THEME в файле ~/.zshrc. Выберем, например, тему agnoster:

Мигрируем на ZSH

ZSH_THEME=»agnoster»Тема agnoster

Команды, синтаксис и примеры

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

Пример передачи аргументов в скрипте Bash

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

sh список песен

Доступ к аргументам осуществляется внутри скрипта с использованием переменных $ 1 , $ 2 , $ 3 и т. Д. Переменная $ 1 ссылается на первый аргумент, $ 2 – на второй аргумент, а $ 3 – на третий аргумент. Это иллюстрируется в следующем примере:

FILE1 = $ 1 wc $ FILE1

Для удобства чтения назначьте переменную с описательным именем значению первого аргумента ( $ 1 ), а затем вызовите утилиту подсчета слов (wc) для переменной $ FILE1 ,

Если у вас есть переменное число аргументов, используйте переменную $ @ , которая является массивом всех входных параметров. Это использует цикл for для итеративной обработки каждого из них, как показано в следующем примере:

для FILE1 в «$ @» do wc $ FILE1 сделано

Вот пример того, как вызвать этот скрипт с аргументами из командной строки:

sh songlist1 songlist2 songlist3

Если аргумент имеет пробелы, заключите его в одинарные кавычки. Например:

sh ‘songlist 1’ ‘songlist 2’ ‘songlist 3’

Флаги Метод

Часто сценарий написан так, что аргументы могут быть переданы в любом порядке с использованием флагов. С помощью метода flags некоторые аргументы можно сделать необязательными.

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

makereport -u jsmith -p notebooks -d 10-20-2011 -f pdf

Bash включает эту функцию с помощью функции getopts. Для приведенного выше примера используйте getopts следующим образом:

, пока getopts u: d: p: f: option do case «$ {option}» in u) USER = $ {OPTARG} ;; < br /> d) DATE = $ {OPTARG} ;; p) PRODUCT = $ {OPTARG} ;; f) FORMAT = $ OPTARG ;; esac выполнено < br />

Это цикл while, который использует функцию getopts и так называемую строку опций – в данном случае u: d: p: f: – для итерации аргументов. Цикл while проходит по строке optstring, которая содержит флаги, используемые для передачи аргументов, и присваивает значение аргумента, предоставленное для этого флага, переменной option . Затем оператор CASE присваивает значение переменной option глобальной переменной, которая используется после прочтения всех аргументов.

Значения для двоеточий

Двоеточие в строке опций означает, что значения необходимы для соответствующих флагов. В приведенном выше примере u: d: p: f: за всеми флагами следует двоеточие. Это означает, что все флаги нуждаются в значении. Если, например, флаги d и f , как ожидается, не будут иметь значения, строкой опций будет u: dp: f .

Двоеточие в начале строки опций (например, : u: d: p: f: ) имеет совершенно другое значение. Он обрабатывает флаги, которые не представлены в строке optstring. В этом случае значение переменной option установлено в ? и значение OPTARG устанавливается на неожиданный флаг. Это отображает подходящее сообщение об ошибке, информирующее вас об ошибке.

Аргументы, которым не предшествует флаг, игнорируются getopts. Если флаги, указанные в строке опций, не предоставляются при вызове скрипта, то ничего не происходит, если вы специально не обработаете этот случай в своем коде. Любые аргументы, не обрабатываемые getops, могут по-прежнему регистрироваться с помощью обычных переменных $ 1 , $ 2 и $ 3 .

Команды консоли Ubuntu

В Ubuntu команды используются для выполнения разных задач. Посмотреть список всех команд и дополнительную информацию вы можете в документации Ubuntu.

Мы рассмотрим основные команды терминала Ubuntu, с которыми сталкивается каждый пользователь:

Команда ls

Отображает список всех файлов и папок в той директории, в которой вы находитесь.

Команда cd

Переходит в другую указанную директорию или папку.

Команда cp

Копирует файлы и папки в любое место файловой системы.

Команда mv

Перемещает файлы и папки в любое место файловой системы.

Команда rm

Удаляет файлы и папки.

Команда mkdir

Создаёт новую пустую директорию.

Команда cat

Отображает содержимое файла в консоли.

Команда nano и команда vim

Открывают текстовые редакторы nano и vim, в которых можно редактировать файл прямо в консоли.