Skip to main content

Bash общая информация

Консоль работает с текстом, поэтому центральная задача - обработка текста.

Поиск приложения: whereis name

~ - домашняя директория, ~sergey домашняя директория пользователя sergey

cd без аргументов в домашнюю, cd - в предыдущую

Маски для ls 

? один символ
* много символов
[set]

Набор символов, в данном случае s,e,t 

[a-c] a,b,c

[!0-9] где нет цифр

{}

перечисляются наборы текста, например echo f{io,am} 

Утилиты фильтрации текста

cat

перенаправление ввода на вывод

-b - нумеровать только непустые строки;
-E - показывать символ $ в конце каждой строки;
-n - нумеровать все строки;
-s - удалять пустые повторяющиеся строки

cat file1 file2 > file3

grep

поиск строк во вводе

Может анализировать один файл или директорию.

-e несколько регулярных выражений, например -e ... -e ...

-n номер строки, где найдено совпадение

-i, --ignore-case - не учитывать регистр символов;
-v, --invert-match - вывести только те строки, в которых шаблон поиска не найден;
-w, --word-regexp - искать шаблон как слово, отделенное пробелами или другими знаками препинания;
-x, --line-regexp - искать шаблон как целую строку, от начала и до символа перевода строки;
-c - вывести количество найденных строк;
-L, --files-without-match - выводить только имена файлов, будут выведены все файлы в которых выполняется поиск;
-l, --files-with-match - аналогично предыдущему, но будут выведены только файлы, в которых есть хотя бы одно вхождение;
-m, --max-count - остановить поиск после того как будет найдено указанное количество строк;
-o, --only-matching - отображать только совпавшую часть, вместо отображения всей строки;
-h, --no-filename - не выводить имя файла;
-s, --no-messages - не выводить ошибки чтения файлов;
-A, --after-content - показать вхождение и n строк после него; Те -A2 строка + 2 строки после
-B, --before-content - показать вхождение и n строк перед ним;
-C - показать n строк до и после вхождения;
-a, --text - обрабатывать двоичные файлы как текст;
--exclude - пропустить файлы имена которых соответствуют регулярному выражению;
--exclude-dir - пропустить все файлы в указанной директории;
-I - пропускать двоичные файлы;
--include - искать только в файлах, имена которых соответствуют регулярному выражению;
-r - рекурсивный поиск по всем подпапкам;
-R - рекурсивный поиск включая ссылки;

sort

сортировка строк

-b - не учитывать пробелы
-d - использовать для сортировки только буквы и цифры
-i - сортировать только по ASCII символах
-n - сортировка строк linux по числовому значению
-r - сортировать в обратном порядке
-o - вывести результат в файл
-u - игнорировать повторяющиеся строки
-m - объединение ранее отсортированных файлов
-k - указать столбец по которому нужно сортировать строки, если не задано, сортировка выполняется по всей строке.

ls -l | sort -k9
-f - использовать в качестве разделителя полей ваш символ вместо пробела.

cut

извлечение символов из ввода

-b 2-6, 8 отобразит символы от 2 по 6 из строки и 8

-b 5- символы с 5 до конца

-с нечто похожее на -b

-d ':' -f 1,3 считать разделителем : и оставить первый и третий столбцы

sed

операции изменения данных перед выводом

Позволяет вырезать строки, поиск/замена по регулярке, вывод. Крутая штука.

tr транслирование символов на вводе в другие символы

Фоновые задачи

Фоновые задачи не получают данные от клавиатуры

Команда Что делает
command & Запускает процесс в фоне
jobs Показывает список фоновых задач (с job ID: %1, %2 …)
fg %N Переводит задачу номер N в передний план
bg %N Возобновляет приостановленную задачу в фоне
Ctrl+Z Приостанавливает текущий процесс (отправляет в «stopped»)
kill %N Завершает задачу по её job ID
kill PID Завершает задачу по PID
kill -9 PID Жёсткое завершение (если обычный kill не помог)
disown %N «Отвязывает» задачу от текущего терминала (будет жить после выхода)
`ps aux grep name`
pkill -f pattern Завершение процессов по шаблону

История ввода команд

Хранится где-то в сессии, сохраняется в .bash_history при закрытии сессии. Для просмотра введенных команд в пределах сессии используется утилита fc

-l

Последние 15 команд

4 выведет четвертую команду

4 7 команды с 4 по 7

строка - выведет с первого вхождения строки (из 15) и далее

-n без вывода номеров
-e nano

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

Чтобы не вводить редактор, можно в .bash_profile добавить переменную

FCEDIT=nano

!! исполнение предыдущей команды

Специальные файлы

.bash_profile, .bash_logout, .bashrc Если отсутствуют - используются файл /etc/profile и файлы из /etc/profile.d

.bash_profile - сейчас не используется. 

В .profile переменные окружения, .bashrc - скрипты. .bash_login при входе. Но идея осталась.

Последовательность поиска при авторизации, исполняется первый найденный 

  • ~/.bash_profile

  • ~/.bash_login

  • ~/.profile

Исполняет команды при каждом входе в систему.

Итого: 

~/.bashrc

Используется в интерактивных (обычных) shell-ах. Сюда кладём то, что нужно только в терминале:

  • алиасы (alias ll='ls -lh')
  • функции (mkcd() { mkdir -p "$1" && cd "$1"; })
  • настройки PS1 (prompt, цвета)
  • shopt и настройки истории (HISTSIZE, HISTCONTROL)
  • подключение fzf, автодополнений и прочих «тюнингов»

~/.profile

Используется при login-shell (и не только Bash, а sh/dash/zsh тоже могут его читать). Сюда кладём:

  • переменные окружения (PATH, EDITOR, LANG, JAVA_HOME)
  • настройки, которые должны работать и в GUI-программах (например, экспорт GTK_THEME или XMODIFIERS)
  • запуск программ при логине (например, ssh-agent или gnome-keyring-daemon)

~/.bash_profile или ~/.bash_login 

Сегодня почти не нужны. Если они есть, то Bash не будет читать ~/.profile. 

source .profile - перечитать файл

Alias, options и переменные окружения

Алиасы для команд. Создание алиасов: alias cdvoy='cd sipp/demo/animation/voyager'

Пробел перед закрывающей ' означает ожидание ввода пользователя.

unalias name - удаление 

set +o optionname установить опцию, -o убрать. Фиксированный набор. Не впечатлило.

Переменные окружения

Синтаксис: varname='something', использование $varname удаление unset varname

Вызванная программа не знает переменные окружения. Поэтому в скриптах нужно экспортировать нужные переменные в текущее окружение.

Формат timestamp:

%a, %A Аббревиатура дня недели, Полное имя дня недели
%b, %B, %m Аббревиатура имени месяца, Полное имя месяца, Номер месяца в числовом формате
%c Дата и время локали
%C

Последние 2 цифры года

%H, %I, %p Час в 24-часовом формате, Час в 12-часовом формате, эквивалент am/pm
%d, %e Цифра дня, цифра дня с пробелом в случае одной цифры
%D Дата в американском формате (%m/%d/%y)
%j День года 001-366
%M Минута в десятичном представлении
%n, %t Новая строка, табуляция
%R Время в 24-часовом формате
%S Секунда в десятичном формате
%T Время (час:минута:секунда)
%u Номер дня недели в десятичном формате
%U Номер недели в году
%Y Год

Строка приглашения

PS1 - основное приглашение

PS2 - при незавершенной строке

В переменной PS1

Код Что показывает
\u Имя текущего пользователя
\h Имя хоста (до первой точки)
\H Полное имя хоста
\w Текущая директория (полный путь, с ~ для home)
\W Текущая директория (только имя последней папки)
\! Номер текущей команды в истории
\# Номер команды (считает все команды с момента запуска shell)
\$ Отображает $ для обычного пользователя и # для root
\t Время в формате HH:MM:SS
\T Время в формате HH:MM (12-часовой формат)
\@ Время в формате hh:mm AM/PM
\d Дата (например: Mon Aug 26)
\n Перенос строки
\s Имя используемой оболочки (обычно bash)
\v Версия Bash (например: 5.2)
\V Версия Bash с патч-уровнем
\j Количество фоновых задач, запущенных из shell
\! Номер команды в истории
\# Номер команды (считает все команды в текущей сессии)
\e или \033 Escape-символ (для цветов/ANSI-последовательностей)

Пример: PS1="\u@\h:\w\$ "

PATH

Просмотр последовательно всех путей.

Добавление в пути: PATH=$PATH":/home/you/bin"

Для ускорения поиска пути к приложениям хранятся в хэш таблице в каждой сессии. 

hash -r очищает таблицу хэшей путей.

CDPATH

Аналог path для директорий поиска при использовании cd.