Оболочка
Born again shell - усовершенствованная оболочка Bourne shell.
Командный процессор, работающий, как правило, в интерактивном режиме в текстовом окне, так же, может читать команды из файла, т.е. написание скриптов.
Общее
history - история команд
set +o history - отключить историю (-о включить)
cd - - переход в последнюю директорию
which/whatis - путь к исполняемому файлу/краткая справка
strace/ltrace - трассировщики, системных, библиотечных вызовов, работают по разному
file - определение типа файла
type - проверка команды (путь к бинарнику либо что из себя представляет)
ldd - список библиотек от которых зависит программа
zless/zcat/zgrep - для работы с архивами
tr '<source>' '<dest>' - замена/преобразование строк
strings - Команда для извлечения строк из указанного файла
Приемы
strace
Статистика системных вызовов -с
Подключение к запущенной программе strace -p 31796
Для фильтрации вывода есть ключ -e (strace -e trace=stat <command>)
stat - вызовы stat
file - все системные вызовы, которые касаются файлов;
process - управление процессами;
network - сетевые системные вызовы;
signal - системные вызовы, что касаются сигналов;
ipc - системные вызовы IPC;
desc - управление дескрипторами файлов;
memory - работа с памятью программы.
Формы команд
cmd & - выполнить в фоновом режиме.
{ cmd1; cmd2; } - выполнить группой, в текущей оболочке, () - в подоболочке
cmd1 | cmd2 - направить выход cmd1 на вход cmd2
cmd1 `cmd2` - выход cmd2 в аргументами в cmd1, $(cmd2) по стандарту POSIX
cmd $(выражение) - арифметический результат выражения, аргументами в cmd.
cmd1 && cmd2 - логическое И, || ИЛИ
!cmd - инверсия кода результата.
# Выполнить указанные команды в фоне
nroff file > file.txt &
# Выполнить команда последовательно
cd; ls
# Переадресация результатов
(date; who; pwd) > logfile
# Отсортировать, подготовить и вывести результат
sort file | pr -3 | lpr
# Отобразить эхом сообщение об ошибке при неудаче
grep 'XX file' || echo "XX not found"
# Различия в файлах, после их сортировки
diff -u <(sort file1) <(sort file2) | less
# Подстановка имен файлов
ls -l ./{*.sh,*.py}
ls -l [a-c]*
ls -l [^ab]* (отрицание)
# Группировка команд. Важно что между фигурными скобками и командами должны быть пробелы и каждая команда завершаться точкой с запятой
xxxls || { echo "alternative branch"; exit 1; }
Переадресация ввода/вывода
0 | Ввод | stdin | Клавиатура |
1 | Вывод | stdout | Экран терминала |
2 | Вывод ошибок | stderr | Экран терминала |
* cmd > file - перезаписать выводом команды файл » присоединить
cmd < file - входные данные для команды из файла
cmd 2> file - вывод только ошибок в файл
cmd &1> file - весь вывод в файл (&1> /dev/null - подавление вывода)
Специальные имена файлов
/dev/(stdin|stdout|stderr) - дубликаты 0,1,2.
/dev/fd/<n> - дескриптор файла <n>
/dev/(tcp|udp)/<host>/<port> - оболочка устанавливает соединение, используя полученный дескриптор для В/Вывода
Ввод/вывод
echo - выводит выражение или переменную stdout.
printf - форматированный вывод
read - читает значение из stdin
Файловая система
cd - сменить текущий каталог
pwd - текущий каталог
pushd, popd, dirs - работа с каталогами
ll - алиас ls -l
Действия над переменными
getopts - разбор переменных, переданных из командной строки
let - арифметические операции над переменными
eval - транслирует список аргументов в команды
set / unset - изменяет значение внутренних переменных скрипта / удаляет переменную
export - сделать переменную доступной дочерним процессам
declare, typeset - задают (и накладывают) ограничения на переменные
Управление сценарием
source, . (точка) - запуск указанного сценария
exit - завершение работы сценария
exec - заменяет текущий процесс новым
shopt - позволяет изменять ключи оболочки «на лету»
Управление запущенными задачами
<command>& - запускает задание в фоне (ctrl+z приостанавливает текущее)
jobs - список фоновых задач (-p -l)
bg/ fg - перенести/ вернуть задание в фон
wait - ожидает завершение фоновых задач
kill <pid> - прервать выполнение задания
Переменные окружения
Временная, локальная переменная (очистится при окончании сессии)
Для долгосрочного хранения, нужно добавить ее в файл .bashrc, в домашней директории. После обновить конфигурацию командой source .bashrc
# Просмотр текущий переменных
env
myVar=Value
echo myVar
export myVar=Value
export PATH=$PATH:/place/with/the/file
# Для сохранения добавить в один из файлов
~/.bash_profile, ~/.bashrc, or ~/.profile
# Применить переменные окружения из файла
# пропускаются строки начинающиеся с # или [
# в файле перечислены в формате key="value"
eval $(grep -v '^[#|\[]' service.env)
Горячие клавиши
Ctrl + A (E) - перемещает курсор в начало (конец) строки
Ctrl + L - очистить экран (clear)
Ctrl + R - поиск по ранее введенным командам
Alt + . - подставить последнюю команду
Приглашение ввода
строка приглашения ввода содержится в спец переменных: «PS[0-4]«
PS0 – после чтения команды и до ее выполнения
PS1 – Основная строка приглашения
PS2 – Многострочный ввод
PS3 – Подсказка для команды выбора
PS4 – Перед отображением каждой команды при трассировки выполнения. Первый символ может реплицироваться несколько раз, чтобы указать несколько уровней косвенности.(+)
Значения можно устанавливать интерактивно либо в конфиге (есть в .bashrc, применяется после ребута)
Есть целый ряд спец аргументов для расширения данных, типа версий, даты времени и т.д. много вариантов
Поддерживается unicode т.ч. можно указать цвета и даже смайлики (эмоджи)
С помощью утилиты «alerm» или «bashish» в консоль можно задать визуальное оформление, цвета, прозрачность и многое другое
# Очистка, собсна так же можно и устанавливать значения интерактивно
unset PS1; PS1=""
Примеры
# Текущая дата в указанном формате
echo $(date '+%Y-%m-%d')
# Простой цикл в интерактивном режиме
while !./run.sh; do sleep 1; done
# Создать файл указанного размера (10м)
dd if=/dev/zero of=out.txt bs=1M count=10
# Замена пробелов на табуляцию (строчных на прописные "tr a-z A-Z")
cat geeks.txt | tr ':[space]:' '\t' > out.txt
Перечень директорий в строчку, без запятых и проч, для массива в общем
# только надо переходить в целевую папку
echo $(ls -d */ | cut -f1 -d'/')
# Вот норм вариант
find . -maxdepth 1 -type d -printf "%P "