Added solutions to 01_bash. Some other improvements

pull/1/head^2
vlpr 1 year ago
parent 80003187bc
commit 6f2da28071

@ -0,0 +1,234 @@
# Решения
## 1
Повторите структуру директории с помощью команд `mkdir` и `touch`:
```
mkdir project
cd project
mkdir backup
mkdir data
mkdir data/raw/
touch data/raw/2022-07-23-exp1.data
touch data/raw/2022-07-23-exp1.log
touch data/raw/2022-08-03-exp2.calib
touch data/raw/2022-08-03-exp2.data
touch data/raw/2022-08-03-exp2.log
touch data/raw/2022-11-23-exp3.calib
touch data/raw/2022-11-23-exp3.data
touch data/raw/2022-11-23-exp3.log
mkdir shared
mkdir -p this/is/a/long/and/strange/path
```
## 2
Вы в директории `/home/stud/project/`. Какая из команд переместит вас в домашнюю директорию?
```
3 cd /home/stud
5 cd ~
7 cd ~/data/..
8 cd
9 cd ..
```
## 3
Перейдите в папку `backup`. Используя команду `cp`, выполните следующие действия одной строкой:
- скопируйте два файла: `.bashrc` и `.bash_profile` в папку `backup`,
- скопируйте файл `.bashrc` в две директории: `/tmp/` и `shared`.
```
cd ~/project/backup/
cp -t ./ ~/.bashrc ~/.bash_profile
cp ~/.bashrc/ /tmp/
cp ~/.bashrc /home/stud/project/shared/
```
## 4
Создайте файл `dummy` в `/tmp`. Попробуйте удалить его указав флаг `-i` для команды `rm`. В чём отличие удаления файла с этим флагом и без него?
```
mkdir /tmp/dummy
rm -r -i /tmp/dummy
rm: remove directory '/tmp/dummy'? y
rm -r /tmp/dummy
```
Отличие в запросе подтверждения действия.
## 5
Скопируйте файлы экспериментов в `backup`, но распределите их по папкам. Файлы с расширением `.datа` в `backup/data`, файлы с расширением `.calib` в `backup/calibration`, логи `.log` в `backup/logs`. В `shared` поместите все файлы, созданные 23 числа в папку `23day`. Напишите команды в двух вариантах: с относительными путями и с абсолютными и проверьте, что их выполнение даёт одинаковый результат.
```
cd backup
mkdir data calibration logs 23day
cp ../raw/*.data ./data/
cp /home/stud/project/raw/*.calib /home/stud/project/backup/calibration
cp /home/stud/project/raw/*.log /home/stud/project/backup/logs/
cp /home/stud/project/raw/*-23-* /home/stud/project/backup/23day/
```
## 6
Посчитайте количество строк, слов и символов в файле `/var/log/dpkg.log`.
```
wc -l /var/log/dpkg.log
cat /var/log/dpkg.log | wc -l
wc -w /var/log/dpkg.log
wc -m /var/log/dpkg.log
```
## 7
Инициализируйте файл `head_tail_messages` с помощью команды `head` из строк в `/var/log/dpkg.log`. Затем добавьте в `head_tail_messages` последние 23 строки из `/var/log/dpkg.log`.
```
sudo head /var/log/dpkg.log > head_tail_messages
sudo tail -n 23 /var/log/dpkg.log >> head_tail_messages
```
## 8
Постройте конвейр с помощью оператора `|`, который считывает содержимое `/var/log/dpkg.log`, находит только строки содержащие слово `perl`, сохраняет результат в файл `/tmp/perl_pkgs` и одновременно выводит в консоль количество найденных строк.
```
cat /var/log/dpkg.log | grep perl | tee /tmp/perl_pkgs | wc -l
```
## 9
Выполните две команды: `head /nonexistent; echo Ok` и `head /nonexistent && echo Ok`. В чём отличие в поведении?
В первом случае вторая команда выполнится, несмотря на не нулевой код ошибки. Во втором не выполнится, в консоли не напечатается "Ok".
## 10
Оператор `||` похож на оператор ИЛИ в программировании. Что вы ожидаете увидеть при запуске `mkdir test || echo Ok`? Проверьте так ли это.
Так как первая команда выполнится успешно, значение выражения можно считать истинным даже если другие будут выполнятся с ошибками. Поэтому вторая команда выполняться не будет.
## 11
Создайте псевдонимы: `dc`, `chomd` которые разрешаются в команды: `cd`, `chmod` чтобы наконец решить проблему опечаток.
Создайте псевдоним `ls` для команды `ls -alF` и `cdw` для команды `cd /home/stud/project/`. Проверьте работу псевдонимов.
Удалите псевдоним `ls` командой `unalias`. Проверьте, что выдача соответствует оригинальной команде `ls`.
```
alias dc="cd"
alias chomd="chmod"
alias ls="ls -alF"
alias cdw="cd /home/stud/project/"
unalias ls
```
## 12
Прочитайте мануал `man ls` и напишите `ls` команду, которая выводит список файлов в следующем виде:
* список файлов включает скрытые,
* размер файла указан с метрическими приставками (e.g. 454M вместо 454279954),
* файлы выводятся в историческом порядке,
* вывод в цвете.
```
ls -caht или ls -cahtl
```
## 13
Попробуйте вывести содержимое переменной среды `HOME` с помощью `echo` в одинарных и двойных кавычках. В чём разница?
```
echo "$HOME"
echo '$HOME'
```
Разница в том, что выражения внутри двойных кавычек интерпретируются, а в одинарных нет. В первом случае выведется значение переменной HOME, во втором `$HOME`.
## 14
Запишите в переменную среды `PATH` значение `""`. Как это повлияло на выполнение команд? Перелогиньтесь и попробуйте вызывать любую команду заново. Сохранилиcь ли изменения?
Первое слово в консоли интерпретируется как вызов исполняемого файла, функции или псевдонима. Поиск исполняемых файлов с переданным названием ведётся в директориях, перечисленных через `:` в переменной среды PATH. Поэтому при пустом списке ни один исполняемый файл не будет найден.
```
export PATH=””
следствие: ни один исполняемый файл системой теперь не находится
после переподключения система вернулась в прежнее состояние
```
## 15
C помощью bash синтаксиса для арифметических операций выведите результат:
- сложения 10 и 4,
- умножения 10 на 4,
- деления 10 на b, где b это переменная равная 3.
Сохраните результат операции `a % b` в переменную `c`, где `a` и `b` результаты любых предыдущих двух операций. Выведите `с`.
```
echo $((10 + 4))
echo $((10 * 4))
b=3
echo $((10 / b))
a=$((10 * 4))
b=$((10 / b))
c=$((a % b))
echo $c
```
## 16
Выполните в терминале следующую команду в директории `/tmp`:
```
for species in cubane ethane methane;
do
for temperature in 25 30 37 40;
do
mkdir $species-$temperature;
done
done
```
Что в результате вы видите в консоли? Модифицируйте команду так, чтобы у директорий в начале названия присутствовал глобальный индекс `idx`. На каждой итерации внутреннего цикла `idx` должна увеличиваться на единицу.
```
idx=0;
for species in cubane ethane methane;
do
for temperature in 25 30 37 40;
do
mkdir $idx-$species-$temperature;
((idx+=1));
done
done
```
```
idx=-1; for species in cubane ethane methane; do for temperature in 25 30 37 40; do mkdir $idx-$species-$temperature; ((idx+=1)); done; done
```
## 17
Напишите цикл, который проходит по списку файлов в текущей директории и выводит полный путь к директории и имя файла.
```
for f in `ls`; do
echo `pwd` $f;
done
```
## 18
Далее поработайте с командой `watch date`. Команда `watch` вызывает периодически переданную ей команду в качестве аргумента. Это удобно для организации простого мониторинга.
Первый раз вызовите команду и отправьте процессу сигнал `SIGINT` комбинацией клавишь `Ctrl+C`.
Второй раз вызовите команду и отправьте процессу сигнал `SIGTSTP` комбинацией клавишь `Ctrl+Z`. Выведите статус процесса командой `jobs`. Переведите процесс в активное состояние командой `fg` и остановите процесс.
Третий раз вызовите команду с добавлением одиночного символа `&`. Остановите процесс командой `kill`.
*man страницы: kill, signal*
Механизм сигналов - примитивный способ общения с процессами. Часть кодов сигналов процесс обязан обработать, часть может обработать исходя из заданной программистом логики.
При запуске процесса в интерактивном режиме его потоки ввода и вывода соединяются с терминалом. Символ & позволяет запустить процесс в фоновом режиме, не делая связывания потока ввода.
## 19
Напишите команду, которая рекурсивно находит все HTML-файлы в папке и запаковывает их в tar.gz архив. Ваша команда должна работать, даже если в файлах есть пробелы.
```
find . -type f -name "*.html" -print0 | xargs -0 tar cfz htmls.tar.gz
```
## 20
(*) Напишите команду или сценарий для рекурсивного поиска самого последнего измененного файла в каталоге. В общем, можете ли вы перечислить все файлы по давности?
Плохое решение
```
ls -Rlht
```
Лучше
```
find ./ -type f -printf "%T+ %H%P\n" 2>/dev/null | sort -r
```
где
%T+ - время последнего изменения в формате 2004-04-28+22:22:05.0,
%H - путь к директории, в которой файл найден,
%P - имя файла.

@ -68,7 +68,7 @@ project/
## 11
Создайте псевдонимы: `dc`, `chomd` которые разрешаются в команды: `cd`, `chmod` чтобы наконец решить проблему опечаток.
Создайте псевдоним `ls` для команды `ls -alF` и `cdw` для команды `cd /home/stud/project/`. Проверьте работу псведонимов.
Создайте псевдоним `ls` для команды `ls -alF` и `cdw` для команды `cd /home/stud/project/`. Проверьте работу псевдонимов.
Удалите псевдоним `ls` командой `unalias`. Проверьте, что выдача соответствует оригинальной команде `ls`.

@ -529,6 +529,8 @@ DHCP состоит из двух компонентов: протокола д
|MX |15| mail exchange|
|TXT |16| text strings|
Проект, в котором можно поэкспериментировать с DNS https://messwithdns.net/.
Источники:
- https://datatracker.ietf.org/doc/html/rfc1035
- https://www.youtube.com/watch?v=-wMU8vmfaYo&list=PLowKtXNTBypH19whXTVoG3oKSuOcw_XeW&index=14

@ -2,6 +2,8 @@
Сценарии оболочки — это следующий шаг в сложности комбинирования команд после конвейеров. Большинство оболочек имеют собственный язык сценариев с переменными, потоком управления и собственным синтаксисом. Сценарии оболочки отличаются от других языков программирования сценариев тем, что они оптимизированы для выполнения задач, связанных с оболочкой. Таким образом, создание конвейеров команд, сохранение результатов в файлы и чтение из стандартного ввода являются примитивами в сценариях оболочки, что делает их более простыми в использовании, чем языки сценариев общего назначения. Далее задания посвящены сценариям bash, поскольку они наиболее распространены.
При написании скриптов используйте https://www.shellcheck.net/, чтобы проверить их на ошибки до запуска.
### 1.
Чтобы назначить переменные в bash, используйте синтаксис `foo=bar`. Чтобы получить доступ к значению переменной запишите знак `$` перед её именем `$foo`. Обратите внимание, что `foo = bar` не будет работать, так как интерпретируется как вызов программы `foo` с аргументами `=` и `bar`. Как правило, в сценариях оболочки символ пробела выполняет разделение аргументов. Поначалу такое поведение может сбивать с толку, поэтому всегда проверяйте его.

@ -53,7 +53,7 @@ apt remove ifupdown
Пробросьте порты: `22`, `80`, `443`.
Организуйте удалённый доступ к машинам по `ssh` ключу.
Организуйте удалённый доступ к машинам по `ssh` ключу. Запретите доступ по ssh через пароль.
## 2. Подготовка виртуальной машины к занятиям `00`.

Loading…
Cancel
Save