Приручаем linux-консоль
TRANSCRIPT
![Page 1: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/1.jpg)
Приручаем linux-консоль
Сергей Коржнев2ГИС
![Page 2: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/2.jpg)
О чем доклад?
● Научимся читать bash-код● Пробежимся по нескольким полезным
консольным утилитам● Развенчиваем миф, что php уже не торт● Убедимся, что php в 100500 раз
практичнее bash-а для консольных приложений
![Page 3: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/3.jpg)
Основы bash
![Page 4: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/4.jpg)
$PATH
$ echo $PATH/bin:/usr/bin:/usr/local/bin:/usr/games
$ mkdir bin$ PATH=$PATH:$HOME/bin
$ type <command> - информация о команде
![Page 5: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/5.jpg)
Hello World
#!/bin/bashprintf "%s\n" "Hello, World"
![Page 6: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/6.jpg)
Позиционные параметры
printf "Hello, %s!\n" "$1"
$ hello JohnHello, John!$ hello SusanHello, Susan!
$1 - $9${15}
![Page 7: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/7.jpg)
Специальные параметры
$# - кол-во входных параметров$$ - идентификатор процесса?$ - код завершения последней выполненной команды
![Page 8: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/8.jpg)
Переменные
name=VALUE
![Page 9: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/9.jpg)
printf
$ printf "%s\n" Print arguments on "separate lines"Printargumentsonseparate lines
![Page 10: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/10.jpg)
Спецификаторы printf
%s - строка%d - целое число%f - дробное число%b - строка, обрабатывающая escape-последовательности
![Page 11: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/11.jpg)
I/O
$ printf "" > FILENAME - stderr все равно в монитор
$ printf "" > FILENAME 2 > /dev/null
$ printf "" > FILENAME 2>&1 - оба потока в один файл
![Page 12: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/12.jpg)
Reading Input
$ read a bSun Mon$ echo $aSun$ echo $bMon
![Page 13: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/13.jpg)
Командная подстановка
$ date=`date` - старый синтаксис$ date=$( date ) - новый$ wc -l $( date +%Y-%m-%d ).log
$ printf -v num4 "%04d" 4$ printf "%s\n" "$num4"0004
![Page 14: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/14.jpg)
Статус выхода
$ printf "%v"-bash: printf: v': недопустимый символ форматирования$ echo $?1
0 - истина!0 - ложь
![Page 15: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/15.jpg)
Сравнение целых
$ test 1 -eq 1$ echo $?0
$ [ 2 -eq 1 ]$ echo $?1
![Page 16: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/16.jpg)
Сравнение целых
-eq - equal-ne - not equal-gt - greater than-lt - less than -ge - greater than or equal to-le - less than or equal to
![Page 17: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/17.jpg)
Сравнение строк
$ test "$a" = "$b" $ [ "$q" != "$b" ](кроме NIL (ASCII 0))
$ [ -z "" ] - true - Is empty?
$ test -n "" - false - Is not empty ?
![Page 18: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/18.jpg)
Еще опции
test -d "$directory" && cd "$directory"[ -d "$dir"] && cd "$dir"
man test - все тут!
![Page 19: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/19.jpg)
Арифметическое выражение
$ test $(( 2-2 )) -ne 0$ echo $?1
![Page 20: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/20.jpg)
If
if <condition list>then <list>fi
![Page 21: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/21.jpg)
If
read nameif [ -z "$name" ]then echo "No name entered" >&2 exit 1elif [ "$number" -eq "Sergey"] echo "Very well"else echo "Ok"fi
![Page 22: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/22.jpg)
If
if test -d "$dir" && cd "$dir"then echo "$PWD"fi
![Page 23: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/23.jpg)
Case
case WORD in PATTERN) COMMANDS ;; PATTERN) COMMANDS ;; ## optional
case $1 in *"$2"*) true ;; *) false ;;esac
![Page 24: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/24.jpg)
While
while <list>do <list>done
![Page 25: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/25.jpg)
While
n=1while [ $n -le 10 ]do echo "$n" n=$(( $n + 1 ))done
![Page 26: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/26.jpg)
For
for (( n=1; n<=10; ++n ))do echo "$n"done
breakcontinue
![Page 27: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/27.jpg)
Конкатенация
a=$HOME/bin
![Page 28: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/28.jpg)
Построчное чтение файла
cat data | while read a; do echo $a; done
![Page 29: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/29.jpg)
Полезняшки
![Page 30: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/30.jpg)
Утилиты
$ mkdir -p dir1/dir2/dir3 - создаст вложенные директории
$ cp img1.jpg img2.jpg dir2/.$ cp img1.jpg img2.jpg dir2/ - копировать файлы в директорию
$ cp -R <...> - копирует каталоги тоже
![Page 31: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/31.jpg)
Утилиты
$ which top/usr/bin/top
$ echo < some_file.txt - содержимое файла в качестве входных данных
$ head -n 5 - первые 5 строк (по умолчанию 10)$ tail - полностью аналогично
![Page 32: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/32.jpg)
Утилиты
$ locate <...> - быстрый поиск файлов$ updatedb - обновить индекс для locate$ locate -i - не учитывать регистр
$ grep -i - не учитывать регистр$ grep -n - показывать номера строк$ grep -v - все кроме$ grep -l - только названия файлов$ !! - выполнится предыдущая команда
![Page 33: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/33.jpg)
Утилиты
$ alias - списко алиасов$ alias ll=’ls -alF’ - пример алиаса
$ host <ip или домен>
![Page 34: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/34.jpg)
Утилиты
$ sed 's/str1/str2/g' example.txt - заменить str1 на str2 в файле example.txt
$ echo a b c | awk '{print $1}' - вывести первую колонку
$ echo a b c | awk '{print $1,$3}' - оставить первую и третью колонку
![Page 35: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/35.jpg)
Утилиты
$ sort file1 file2 | uniq - отсортировать содержимое двух файлов без повторов
$ cd - - перейти в предыдущую директорию
![Page 36: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/36.jpg)
Find
$ find . *.txt - найти txt-файлы, начиная поиск с текущей директории
$ find /path -type d -exec chmod 0755 {} \;
$ find /path -type d | xargs chmod 0755
![Page 37: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/37.jpg)
![Page 38: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/38.jpg)
![Page 39: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/39.jpg)
PHP не модно?
Тольковый словарь Даля
МО́ДА ж. франц. проходящий обычай; временная, изменчивая прихоть в житейском быту, в обществе
![Page 40: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/40.jpg)
● Простота, простота и... щас внимание простота
● Плюс/минус один и тот же performance
● Отсутствие syntactic sugar компенсируется поддержкой прокаченных IDE (читай PHP Storm) и библиотеками
● В России Python и Ruby не промышленные языки.
Почему PHP?
![Page 41: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/41.jpg)
Смысл?
![Page 42: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/42.jpg)
php script.php param1 param2
$argv - массив входящих параметров$argv[0] - имя вызываемого скрипта
$argc - размер массива $argv
Параметры не должны начинаться с одиночного деффиса
![Page 43: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/43.jpg)
Для реальных пацанов
#!/usr/bin/php<?php var_dump($argv);
Для надежности первую строчку можно заменить:#!/usr/bin/env php
Ограничений на название параметров нет
![Page 44: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/44.jpg)
I/O
STDINSTDOUTSTDERR
fwrite(STDERR, "stderr\n");
$line = fgets(STDIN);
![Page 45: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/45.jpg)
Особенности
● байт-код не кешируется, слишком много includ-ов не желательно
● В cli-режиме echo по умолчанию вызывает flush()
● Ошибке лучше выводить в STDERR, т.к. вывод программы может быть перенарпавлен куда-то еще и пользователь не увидит ошибку
● exit(NUM) ● string exec ( string $command [, array
&$output [, int &$return_var ]] )
![Page 46: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/46.jpg)
● Даже если определить register_shutdown_function, то Ctrl+Z все равно не отловится
● Перед fork-ом нужно закрывать все соединения с БД
Особенности
![Page 47: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/47.jpg)
Почему PHP, а не BASH
● Гораздо ближе к C-образным языкам, а, значит, понятнее большинству программистам
● Мощная поддержка IDE● Сложнее выстрелить себе в ногу. Гораздо
строже относится к ошибкам.● Может все, что может bash● Гораздо больше возможностей
![Page 48: Приручаем linux-консоль](https://reader033.vdocuments.mx/reader033/viewer/2022060119/558c9393d8b42ae2098b45d8/html5/thumbnails/48.jpg)
Вопросы
:)