Linux для чайника – Telegram
Linux для чайника
20K subscribers
86 photos
4 files
77 links
Linux
- Разбор утилит / инструментов
- Новости / факты
- Опросы для проверки знаний, навыков
и многое другое.

Только по вопросам сотрудничества: @altmainf

Регистрация в перечне РКН https://clck.ru/3EpL9L
Download Telegram
Параметры командной строки - как данные для программы.

Содержатся эти параметры в переменных с номерами. Например: 
$0 — имя скрипта, 
$1 — первый параметр, 
$2 — второй параметр и т. д.
Также существуют две вспомогательные переменные: 
$# содержит количество переданных аргументов; 
$@ содержит все аргументы, переданные скрипту, разделенные пробелами.

Называем, передаем и запускаем: ./q.sh 1 2 5 41

Получим:
Имя скрипта: ./q.sh
Количество переданных аргументов: 4
arg='1'
arg='2'
arg='5'
arg='41'
Создаем архив tar.gz текущего каталога

Конструкция ${PWD##*/} - пишет в переменную name полный путь до текущего каталога, удаляет из этого пути все, оставляя только имя самого каталога.

Скрипт запускается из каталога, архив которого нужно получить.
Максимально простой вариант отладки bash- скриптов по шагам.

- Команда trap перехватывает сигнал DEBUG, посылаемый перед выполнением команды
- Команда read ожидает ввода чего-нибудь с клавиатуры (в данном случае нам нужно только ENTER либо Ctrl+C)
- Переменная окружения $BASH_COMMAND, валидная внутри обработчика команды trap.

Запускаем скрипт.
Перед выполнением каждой команды выводится то, что будет исполняться, затем интерпретатор начинает ожидать нажатия клавиши <ENTER>.
Если понимаем, что что-то пошло не так, нажимаем Ctrl+C и выходим из отладки.
Плохая читаемость обратных кавычек (одинарные кавычки с "наклоном вправо") в некоторых шрифтах может привести к путанице с обычными одинарными кавычками.

Конструкция $() позволяет использовать вложенные вызовы без головной боли с экранированием.
Как вы знаете, известные сочетания клавиш Ctrl+C (копировать) и Ctrl+V (вставить) не дадут тех результатов в оболочке Bash, которых бы мы хотели.

Вместо них используйте сочетания клавиш Shift+Ctrl+C и Shift+Ctrl+V. Вы также можете вырезать и вставлять текст, щелкнув правой кнопкой мыши и выбрав соответствующую операцию в меню. И это может оказаться удобней.
Горячие клавиши VIM

Vim — это продвинутый текстовый редактор с широкими возможностями настройки. 

Для перемещения по файлу:
 • h - на один символ влево;
 • l - на один символ вправо;
 • j - на одну строку вниз;
 • k - на одну строку вверх;
 • w - на слово вправо;
 • b - на слово влево;
 • H - перейти в низ экрана;
 • G - перейти в конец файла;

Если перед тем как нажать кнопку буквы нажать цифру, то эта команда будет повторена несколько раз. Например, 3j переведет курсор на три строки вверх.

Для переключения в режим редактирования:
 • i - вставить текст с позиции курсора, символ под курсором будет заменен;
 • I - вставить текст в начало строки;
 • a - добавить текст начиная от позиции курсора;
 • o - вставить новую строку после этой и начать редактирование;
 • O - вставить новую строку перед этой и начать редактирование;
 • r - заменить текущий символ;
 • R - заменить несколько символов.

Можно запустить редактор и потыкаться во всем самостоятельно или же пройти курс обучения, который встроен в vim, набрав: vimtutor
Заготовка для скрипта, попутно выполняющего логирование с датой и временем в отдельном файле.

Можно, к примеру, зафиксировать выполнение бэкапа, поместив эти действия между log "..." - функциями.
Команда ifconfig 

Одна из возможностей - отображение параметров сетевого интерфейса.
Если ввести ifconfig в терминал, то получим список активных интерфейсов. 

Поля вывода ifconfig:
HWaddr - аппаратный MAC-адрес;
inet addr - IPv4-адрес интерфейса;
inet6 addr - IPv6-адрес интерфейса;
Bcast - широковещательный адрес
Mask - маска сети
MTU - значение MTU (Maximum transmission unit - максимальный объём данных, который может быть передан за одну итерацию); 
collision - счетчик коллизий, если количество коллизий больше 0, с ва­шей сетью творится что-то неладное; 
RX packets - количество принятых пакетов; 
TX packets - количество переданных пакетов; 
RX bytes - количество принятых байтов; 
TX bytes - количество переданных байтов. 

Даже если сетевые интерфейсы не настроены, в выводе должен быть интерфейс lo (Local Loopback).
Если его нет, служба network не запущена. Для запуска введите: sudo service network start
Для создания ссылок служит команда ln:

ln some_file link1
Создается жесткая ссылка link1, ссылающаяся на файл some_file.

ln -s some_file link2
Создается символическая ссылка link2, которая ссылается на этот же текстовый файл some_file.

При модификации ссылки (любой: link1 или link2), автоматически модифицируется исходный файл some_file.

Команда ls отобразит символическую ссылку другим цветом (каким именно - зависит от дистрибутива).
Жесткие ссылки в большинстве дистрибутивов никак не выделятся.
Ранее в [ одном из постов ] упоминался способ создания множества однотипных файлов через скобки.

Для подобных целей можно использовать:
touch file{1..500}
Создадутся file1, file2, ...file500

Следующим примером для проекта создаем файлы: 
myapp.html
myapp.css,
myapp.php
myapp.js
touch myapp.{html,css,php,js}

(нигде в перечислении пробелов быть не должно!)

Создаем директории:
mkdir {templates,html,js,css}
​​Архиватор gzip.

Утилита сжатия и восстановления файлов.
Именно в этом формате поставляется большинство программ в исходных текстах. От того и популярность.

Сам по себе gzip "не умеет" сжимать несколько файлов, поэтому перед сжатием требуемые файлы обрабатываются архиватором tar, а потом полученный файл передается архиватору gzip. Отсюда созданные архивы получают двойное расширение tar.gz.

Например, есть несжатый архив some_archive.tar, который мы хотим сжать. Для этого выполним:
gzip -k some_archive.tar

Ключ -k позволяет сохранить несжатый файл. Без его указания исходный файл будет удален.

Извлечем содержимое полученного архива:
gzip -kd some_archive.tar.gz

Ниже приведены все ключи.
Полезные комбинации для ускорения работы.

Поиск введенной ранее команды, щЁлкая клавишу «вверх», может затянуться на некоторое время. Удобнее будет нажать Ctrl + r и начать набирать команду. Оболочка будет предлагать автозаполнение из истории. Когда искомое будет найдено, останется только нажать ENTER

Команду clear для очистки экрана терминала можно заменить сочетанием Ctrl + l

Команду exit для выхода из терминала можно заменить сочетанием Ctrl + d
Для обозначения домашнего каталога в командной строке применяются:

$HOME — эта переменная окружения отображает имя домашнего каталога;

~ — тильда (~) указывает на домашний каталог в командной строке. Ее можно использовать также для того, чтобы идентифицировать чужой домашний каталог. Например, ~vasya указывает на домашний каталог пользователя vasya (вероятно, /home/vasya). Если бы я хотел перейти в каталог /home/vasya/test, то ввел бы cd ~vasya/test.

Другие специальные способы обозначения каталогов:
. — точка (.) отображает текущий каталог;
.. — две точки (..) относятся к каталогу, расположенному непосредственно над текущим каталогом;
$PWD — эта переменная окружения ссылается на текущий рабочий каталог;
$OLDPWD — эта переменная окружения ссылается на предыдущий рабочий каталог до смены его на текущий. (Ввод команды cd возвращает пользователя в каталог, представленный в виде $OLDPWD.)
Для добавления самописных команд или скриптов оболочки в систему, необходимо поместить их в каталог bin в своем каталоге home (например, /home/vasya/bin для пользователя с именем vasya).

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

Таким образом, если вы добавляете команду в каталог bin с разрешением исполнения, ее можно будет использовать, просто введя имя в командной строке интерпретатора.

Чтобы сделать команды доступными для всех пользователей, добавьте их в каталог /usr/local/bin.
К примеру, расширить раздел подкачки или погонять файлы на сервере, чтобы посмотреть его скорость - помогут искусственно созданные пустые файлы определенного размера.

Размер задается обозначениями:
 • KB KiB K
 • MB MiB M
 • GB GiB G
 • TB TiB T
 • PB PiB P
 • ZB ZiB Z
 • YB YiB Y
Pipe

Или просто - конвейер. Это однонаправленный канал межпроцессного взаимодействия. Назван по аналогии с трубопроводом.

Конвейеры чаще всего используются в shell-скриптах для связи нескольких команд путем перенаправления вывода одной команды (stdout) на вход (stdin) последующей, используя символ конвейера ‘|’:
cmd1 | cmd2 | .... | cmdN

Например:
grep -i 'error' ./log | wc -l

grep выполняет регистронезависимый поиск строки “error” в файле log, но результат поиска не выводится на экран, а перенаправляется на вход (stdin) команды wc, которая в свою очередь выполняет подсчет количества строк, в которых содержится одно и более раз слово "error".
Файлы, получаемые из ОС Windows, часто имеют в конце каждой строки символы возврата каретки и перевода строки. В системах Linux и macOS для завершения строки предусмотрен только символ разрыва строки.

Если вы переносите файл в Linux и хотите избавиться от дополнительных возвращаемых символов, можно воспользоваться командой tr:

tr -d '\r' < fileWind.txt > fileFixed.txt

И наоборот, с помощью команды sed можно преобразовать конец строки файлов из ОС Linux в конец строки для ОС Windows:

sed -i 's/$/\r/' fileLinux.txt

Параметр -i вносит изменения на месте и записывает их обратно во входной файл.
В посте [ 10 простых трюков ] было упоминание про команду sudo !! , которая запустит предыдущую команду с привилегиями.

А теперь смотрим на пример последовательности действий:

echo 'Запусти без привилегий'
echo 'Запусти только через sudo'
sudo !!

Пробел перед второй командой не добавит эту команду в историю. а значит с sudo будет запущено не то. что надо.

Вывод: Осознанный пробел перед командой не добавляет эту команду в историю.
Случайный пробел перед командой приводит к неприятным последствиям.
Сравнить два файла, находящихся рядом, и показать все их различия можно командой sdiff

К примеру вывести только строки, которые отличаются:

sdiff -s some_file1 some_file2

Некоторые параметры:
-a — рассматривает все файлы как текстовые.
-i — игнорирует регистр.
-s — удаляет общие строки для двух файлов.
-w — определяет максимальное количество символов для вывода в строке.
По параметрам:
-c — для создания архивного файла,
-z — для архивирования файла и
-f — для указания имени файла вывода.

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

К примеру имеется файл some_file из двух строк, каждая с тремя столбцами данных:
08/06/2022 192.168.10.14 test.html
09/06/2022 192.168.10.185 login.html

В файле каждое поле разделено пробелом. Для извлечения IP-адреса (второе поле) используйте следующую команду:
cut -d' ' -f2 some_file

Получаем:
192.168.10.14
192.168.10.185

Параметр -d' ' указывает, что в качестве разделителя полей используется пробел.
Параметр -f2 определяет, что команде нужно вырезать и отобразить второе поле, в данном случае IP-адреса.