Часть 5. Терминал Linux
⠀В данной статье рассматриваются операторы, запуск скриптов, а также скрипты нашей команды.
Содержание
Операторы
;
⠀Выполняет последовательно несколько команд. Если текущая команда выполнится неуспешно, то следующая всё равно выполнится.
команда_1; команда_2; команда_3; ...
sudo apt-get update; sudo apt-get upgrade
&&
⠀Выполняет последовательно несколько команд. Если текущая команда выполнится неуспешно, то следующая не выполнится.
команда_1 && команда_2 && команда_3 && ...
sudo apt-get update && sudo apt-get upgrade
||
⠀Выполняет следующую команду, если предыдущая выполнилась неуспешно.
команда_1 || команда_2 || команда_2 || ...
ls -a /there_is_no_dir || echo "error"
&
⠀Запускает выполнение команды в фоновом режиме.
команда_1 & команда_2 & команда_3 & ...
sudo apt-get update & sudo apt-get upgrade &
\
- Отменяет специальное назначение (экранирует) символов, таких как
$
,\
,&
,*
,[
,]
,^
,.
; - «Склеивает» несколько строк команды в одну.
команда_1; \ команда_2; \ команда_3 ...
echo "Hello,"\ " world!"
Hello, world!
sudo apt-get update; \ sudo apt-get upgrade
|
⠀Перенаправляет данные из одной команды в другую.
команда_1 | команда_2 | команда_3 | ...
echo '!{"json": ["one", "two"]}' | tr -d '!' | jq -r "." | grep json
"json": [
>
⠀Перенаправляет вывод команды в файл. Перезаписывает файл при существовании. Для скрытия вывода команды можно использовать конструкцию > /dev/null
.
команда > файл
echo "Hello, world!" > /dev/null
echo "Hello, world!" > hi.txt cat hi.txt
Hello, world!
| tee
⠀Оставляет вывод команды на экран, при этом записывает его в файл. Перезаписывает файл при существовании.
команда | tee файл
echo "Hello, world!" | tee hi.txt cat hi.txt
Hello, world! Hello, world!
>>
⠀Перенаправляет вывод команды в файл. При существовании файла дописывает в конец.
команда >> файл
cat hi.txt echo "Hi" >> hi.txt cat hi.txt
Hello, world! Hello, world! Hi
| tee -a
⠀Оставляет вывод команды на экран, при этом записывает его в файл. При существовании файла дописывает в конец.
команда | tee -a файл
cat hi.txt echo "hello" | tee -a hi.txt cat hi.txt
Hello, world! Hi hello Hello, world! Hi hello
2>, 2>>
⠀Перенаправляет вывод ошибок команды в файл:
2>
перезаписывает файл при существовании. Для скрытия ошибок можно использовать конструкцию 2> /dev/null
.2>>
при существовании файла дописывает в конец.
команда 2> файл команда 2>> файл
ls -a /there_is_no_dir 2> /dev/null
ls -a /there_is_no_dir 2> errors.txt cat errors.txt
ls: cannot access '/there_is_no_dir': No such file or directory
ls -a /there_is_no_dir2 2>> errors.txt cat errors.txt
ls: cannot access '/there_is_no_dir': No such file or directory ls: cannot access '/there_is_no_dir2': No such file or directory
&>, &>>
⠀Перенаправляет вывод команды и ошибок в файл:
&>
перезаписывает файл при существовании. Для полного скрытия вывода можно использовать конструкцию &> /dev/null
.&>>
при существовании файла дописывает в конец.
команда &> файл команда &>> файл
printf "%d\n" 2.22 &> /dev/null
printf "%d\n" 2.22 &> output.txt cat output.txt
-bash: printf: 2.22: invalid number 2
printf "%d\n" 4.76 &>> output.txt cat output.txt
-bash: printf: 2.22: invalid number 2 -bash: printf: 4.76: invalid number 4
<
⠀Использует данные из файла в качестве источника ввода в команду вместо клавиатуры.
команда < файл
echo "2*2+2" > calc.txt cat calc.txt
2*2+2
bc < calc.txt
6
<<EOF...EOF
⠀Позволяет ввести в команду многострочный текст.
команда <<EOF многострочный текст EOF
cat <<EOF многострочный текст EOF
многострочный текст
<<<
⠀Передаёт указанный текст в команду вместо ввода с клавиатуры.
команда <<< "текст"
bc <<< "2*2+2"
6
jq -r ".json[1]" <<< '{ "json": ["one", "two"] }'
two
json='{ "json": ["one", "two"] }' jq -r ".json[1]" <<< "$json"
two
<(команды)
⠀Возвращает путь к созданному временному файлу, содержащему результат выполнения одной или нескольких объединённых внутри конструкции команд.
команда <(команда_1; команда_2 && команда_3; ...)
# Путь к временному файлу echo <(uptime)
/dev/fd/63
# Содержимое временного файла cat <(uptime)
00:00:00 up 5 days, 7:25, 2 users, load average: 0.00, 0.00, 0.00
cat <(uptime; date)
00:00:00 up 5 days, 7:27, 2 users, load average: 0.00, 0.00, 0.00 Tue 01 Jan 2022 12:00:00 AM CET
Запуск скриптов
Локальные
⠀Для выполнения скрипта, находящегося на сервере, необходимо:
# Bash chmod +x путь_к_скрипту; \ ./путь_к_скрипту аргументы # Source chmod +x путь_к_скрипту; \ . ./путь_к_скрипту аргументы
# Bash chmod +x script.sh; \ ./script.sh -u -t "hi" "text" 666 # Source chmod +x script.sh; \ . ./script.sh -u -t "hi" "text" 666
По ссылке
⠀Скрипты по ссылке, например из GitHub можно выполнять тремя способами:
# Bash bash <(wget -qO- ссылка) аргументы bash <(curl -s ссылка) аргументы # Source . <(wget -qO- ссылка) аргументы . <(curl -s ссылка) аргументы
# Bash bash <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/colors.sh) -h bash <(curl -s https://raw.githubusercontent.com/SecorD0/utils/main/colors.sh) -h # Source . <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/colors.sh) -h . <(curl -s https://raw.githubusercontent.com/SecorD0/utils/main/colors.sh) -h
# Bash wget -q ссылка; \ chmod +x путь_к_скрипту; \ ./путь_к_скрипту аргументы curl -sO ссылка; \ chmod +x путь_к_скрипту; \ ./путь_к_скрипту аргументы # Source wget -q ссылка; \ chmod +x путь_к_скрипту; \ . ./путь_к_скрипту аргументы curl -sO ссылка; \ chmod +x путь_к_скрипту; \ . ./путь_к_скрипту аргументы
# Bash wget -q https://raw.githubusercontent.com/SecorD0/utils/main/colors.sh chmod +x colors.sh; \ ./colors.sh -h curl -sO https://raw.githubusercontent.com/SecorD0/utils/main/colors.sh chmod +x colors.sh; \ ./colors.sh -h # Source wget -q https://raw.githubusercontent.com/SecorD0/utils/main/colors.sh chmod +x colors.sh; \ . ./colors.sh -h curl -sO https://raw.githubusercontent.com/SecorD0/utils/main/colors.sh chmod +x colors.sh; \ . ./colors.sh -h
# Bash wget -qO- ссылка | bash -s аргументы -- опции curl -s ссылка | bash -s аргументы -- опции
# Bash wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/colors.sh | bash -s -- -h curl -s https://raw.githubusercontent.com/SecorD0/utils/main/colors.sh | bash -s -- -h
Скрипты нашей команды
- Имеют страницы помощи на английском языке (опция
-h
) со всей необходимой информацией; - Тестируются на нескольких серверах с ОС Ubuntu 20.04;
- Предполагают запуск в
source
; - Приспособлены к запуску как в
bash
(тестирование не выполняется), так и вsource
.
⠀В данном разделе разбираются скрипты из раздела utils
, которые упрощают работу с Ubuntu.
⠀Опции, помеченные знаком *
являются обязательными.
Цвета
⠀Для красивого вывода в командах echo
и printf
можно использовать цвета, каждый из которых имеет свой код. С целью заменить непонятные некрасивые коды на что-то элегантное был создан данный скрипт.
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/colors.sh) -h
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/colors.sh) --; \ echo -e "${C_LGn}I'm Light Green${RES}"
Работа с переменными
⠀Для упрощения работы с переменными был создан скрипт, который может:
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/miscellaneous/insert_variable.sh) \ опции
-n
* — название переменной;-v
— значение переменной (если не указать значение, то появится ручной ввод);-a
— добавить alias;-r
— сменить указанное название переменной на указанное в опции-n
;-d
— удалить первое вхождение переменной, указанной в опции-n
;-da
— удалить все вхождения переменной, указанной в опции-n
.
# Ручной ввод значения . <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/miscellaneous/insert_variable.sh) \ -n variable
Enter the value:
# Добавить переменную . <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/miscellaneous/insert_variable.sh) \ -n variable -v "text text" # Добавить alias . <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/miscellaneous/insert_variable.sh) \ -n update -v "sudo apt update \&\& sudo apt upgrade" -a # Переименовать переменную . <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/miscellaneous/insert_variable.sh) \ -n var -r variable # Удалить первое вхождение переменной . <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/miscellaneous/insert_variable.sh) \ -n var -d # Удалить все вхождения переменной . <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/miscellaneous/insert_variable.sh) \ -n var -da
Открытие портов
⠀В зависимости от того, включён ли брандмауэр, осуществляется выбор алгоритма открытия портов. Чтобы не заниматься выбором вручную, был создан этот скрипт, принимающий в качестве аргументов один или несколько портов.
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/miscellaneous/ports_opening.sh) \ порт_1 порт_2 порт_3 ...
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/miscellaneous/ports_opening.sh) \ 9090 9091
Установщики ПО
⠀Существуют программы, которые устанавливаются более сложным способом, нежели при помощи пакетного менеджера. Для облегчения процесса установки некоторых из них были созданы скрипты, например:
Парсер цены токена
⠀Иногда требуется получить цену какого-либо токена, однако поиски общедоступного API не увенчались успехом. Поэтому был создан этот скрипт, получающий цену токена с CoinMarketCap.
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/parsers/token_price.sh) \ опции
-ts
* — название токена или проекта на CoinMarketCap, напримерBTC
,eth
,binance-coin
;-m
— количество токенов для расчёта их стоимости, например0.5
,1,8
,"100 000"
;-r
— округлить цену или стоимость до указанного количества знаков после запятой.
# BTC . <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/parsers/token_price.sh) \ -ts btc
46793.928696
# ETH с округлением . <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/parsers/token_price.sh) \ -ts ETH -r 2
3832.18
# BNB по названию проекта с CMC . <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/parsers/token_price.sh) \ -ts binance-coin
514.327157
# Рассчёт стоимости . <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/parsers/token_price.sh) \ -ts eth -m 0.5 . <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/parsers/token_price.sh) \ -ts twt -m "1 000,45" . <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/parsers/token_price.sh) \ -ts SOL -m "75 000" -r 3
1913.114184 708.175532 12750986.827
XPath парсер
⠀XPath — это один из мощнейших инструментов для навигации по HTML и XML документам. Для упрощения работы с ним был создан специальный скрипт.
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/parsers/xpath.sh) \ опции
-x
* —Full XPath
запрос;-u
— применить запрос к исходному коду сайта;-f
— применить запрос к исходному коду из файла;-te
— применить запрос к исходному коду из заранее объявленной переменной$text
;-ty
— тип парсинга, может бытьHTML
(по умолчанию) илиXML
;-sw
— отображать появляющиеся при парсинге предупреждения.
# Код сайта . <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/parsers/xpath.sh) \ -x "/html/body/div[1]/main/div[3]/div[1]/div[2]/div[1]/div" \ -u "https://etherscan.io/gastracker"
<div class="card-body mt-2"> ... </div>
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/parsers/xpath.sh) \ -x "normalize-space(/html/body/div[1]/main/section/div/div/div[1]/h1/span[1]/text())" \ -u "https://etherscan.io/gastracker"
Ethereum Gas Tracker...~#
# Код из заранее объявленной переменной text=" <html> <body> <h1>Example</h1> </body> </html> " . <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/parsers/xpath.sh) \ -x "/html/body/h1/text()" -te
Example...~#
Скорость выполнения команд
⠀Иногда требуется измерить скорость выполнения одной или нескольких команд. Специально для этого был разработан данный скрипт.
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/miscellaneous/speed_test.sh) \ "команда_1" "команда_2" "команда_3" ...
. <(wget -qO- https://raw.githubusercontent.com/SecorD0/utils/main/miscellaneous/speed_test.sh) \ "df" 'ls -la' 'du -had 0 `pwd` 2>/dev/null | sort -h'
Полезные ссылки
Операторы объединения | Операторы перенаправления
Подстановка процессов (EN) | Скрипты нашей команды
Благодарности
Команда 1package — написание статьи