====== Оболочка ====== Born again shell - усовершенствованная оболочка Bourne shell.\\ Командный процессор, работающий, как правило, в интерактивном режиме в текстовом окне, так же, может читать команды из файла, т.е. [[:linux:binbash|написание скриптов]].\\ ===== Общее ===== * **history** - история команд * **set +o history** - отключить историю (-о включить) * **cd -** - переход в последнюю директорию * **which/whatis** - путь к исполняемому файлу/краткая справка * **strace/ltrace** - трассировщики, системных, библиотечных вызовов, работают по разному * **file** - определение типа файла * **type** - проверка команды (путь к бинарнику либо что из себя представляет) * **ldd** - список библиотек от которых зависит программа * **zless/zcat/zgrep** - для работы с архивами * **tr '' ''** - замена/преобразование строк * **strings** - Команда для извлечения строк из указанного файла **Приемы** * **!!** - последняя команда * **yes | ** - ответ на интерактивные вопросы * **> file** - очистка файла * **** -
:!: **strace** Статистика системных вызовов **-с**\\ Подключение к запущенной программе **strace -p 31796**\\ Для фильтрации вывода есть ключ **-e** (strace -e trace=stat )\\ * **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]* (отрицание) ===== Переадресация ввода/вывода ===== |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/** - дескриптор файла * **/dev/(tcp|udp)//** - оболочка устанавливает соединение, используя полученный дескриптор для В/Вывода ==== Ввод/вывод ==== * **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** - позволяет изменять ключи оболочки "на лету" ==== Управление запущенными задачами ==== * **&** - запускает задание в фоне (ctrl+z приостанавливает текущее) * **jobs** - список фоновых задач (-p -l) * **bg/ fg** - перенести/ вернуть задание в фон * **wait** - ожидает завершение фоновых задач * **kill ** - прервать выполнение задания ===== Переменные окружения ===== Временная, локальная переменная (очистится при окончании сессии)\\ Для долгосрочного хранения, нужно добавить ее в файл **.bashrc**, в домашней директории. После обновить конфигурацию командой **source .bashrc**\\ # Просмотр текущий переменных env myVar=Value echo myVar export myVar=Value export PATH=$PATH:/place/with/the/file # Для сохранения добавить в один из файлов ~/.bash_profile, ~/.bashrc, or ~/.profile ===== Горячие клавиши ===== * **Ctrl + A (E)** - перемещает курсор в начало (конец) строки * **Ctrl + L** - очистить экран (clear) * **Ctrl + R** - поиск по ранее введенным командам * **Alt + .** - подставить последнюю команду ===== Приглашение ввода ===== строка приглашения ввода содержится в спец переменных: "PS[0-4]"\\ * **PS0** – после чтения команды и до ее выполнения * **PS1** – Основная строка приглашения * **PS2** – Многострочный ввод * **PS3** – Подсказка для команды выбора * **PS4** – Перед отображением каждой команды при трассировки выполнения. Первый символ может реплицироваться несколько раз, чтобы указать несколько уровней косвенности.(+)\\ Значения можно устанавливать интерактивно либо в конфиге (есть в .bashrc, применяется после ребута)\\ Есть целый ряд спец аргументов для расширения данных, типа версий, даты времени и т.д. много вариантов\\ Поддерживается unicode т.ч. можно [[https://habr.com/ru/post/269967/|указать цвета]] и даже смайлики (эмоджи)\\ С помощью утилиты "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