Приручаем linux-
   консоль
   Сергей Коржнев
        2ГИС
О чем доклад?
● Научимся читать bash-код
● Пробежимся по нескольким полезным
  консольным утилитам
● Развенчиваем миф, что php уже не торт
● Убедимся, что php в 100500 раз
  практичнее bash-а для консольных
  приложений
Основы bash
$PATH
$ echo $PATH
/bin:/usr/bin:/usr/local/bin:/usr/games

$ mkdir bin
$ PATH=$PATH:$HOME/bin

$ type <command> - информация о команде
Hello World
#!/bin/bash
printf "%sn" "Hello, World"
Позиционные параметры
printf "Hello, %s!n" "$1"

$ hello John
Hello, John!
$ hello Susan
Hello, Susan!

$1 - $9
${15}
Специальные параметры
$# - кол-во входных параметров
$$ - идентификатор процесса
?$ - код завершения последней
выполненной команды
Переменные
name=VALUE
printf
$ printf "%sn" Print arguments on "separate
lines"
Print
arguments
on
separate lines
Спецификаторы printf
%s - строка
%d - целое число
%f - дробное число
%b - строка, обрабатывающая escape-
последовательности
I/O
$ printf "" > FILENAME - stderr все равно в
монитор

$ printf "" > FILENAME 2 > /dev/null

$ printf "" > FILENAME 2>&1 - оба потока в
один файл
Reading Input
$ read a b
Sun Mon
$ echo $a
Sun
$ echo $b
Mon
Командная подстановка
$ date=`date` - старый синтаксис
$ date=$( date ) - новый
$ wc -l $( date +%Y-%m-%d ).log


$ printf -v num4 "%04d" 4
$ printf "%sn" "$num4"
0004
Статус выхода
$ printf "%v"
-bash: printf: v': недопустимый символ
форматирования
$ echo $?
1

0 - истина
!0 - ложь
Сравнение целых
$ test 1 -eq 1
$ echo $?
0

$ [ 2 -eq 1 ]
$ echo $?
1
Сравнение целых
-eq   - equal
-ne   - not equal
-gt   - greater than
-lt   - less than
-ge   - greater than or equal to
-le   - less than or equal to
Сравнение строк
$ test "$a" = "$b"
$ [ "$q" != "$b" ]
(кроме NIL (ASCII 0))

$ [ -z "" ] - true     - Is empty?

$ test -n "" - false    - Is not empty ?
Еще опции
test -d "$directory" && cd "$directory"
[ -d "$dir"] && cd "$dir"

man test - все тут!
Арифметическое выражение
$ test $(( 2-2 )) -ne 0
$ echo $?
1
If
if <condition list>
then
   <list>
fi
If
read name
if [ -z "$name" ]
then
   echo "No name entered" >&2
   exit 1
elif [ "$number" -eq "Sergey"]
   echo "Very well"
else
   echo "Ok"
fi
If
if test -d "$dir" && cd "$dir"
then
   echo "$PWD"
fi
Case
case WORD in
 PATTERN) COMMANDS ;;
 PATTERN) COMMANDS ;; ## optional

case $1 in
 *"$2"*) true ;;
 *) false ;;
esac
While
while <list>
do
 <list>
done
While
n=1
while [ $n -le 10 ]
do
 echo "$n"
 n=$(( $n + 1 ))
done
For
for (( n=1; n<=10; ++n ))
do
 echo "$n"
done




break
continue
Конкатенация
a=$HOME/bin
Построчное чтение файла
cat data | while read a; do echo $a; done
Полезняшки
Утилиты
$ mkdir -p dir1/dir2/dir3 - создаст вложенные
директории

$ cp img1.jpg img2.jpg dir2/.
$ cp img1.jpg img2.jpg dir2/ - копировать
файлы в директорию

$ cp -R <...> - копирует каталоги тоже
Утилиты
$ which top
/usr/bin/top

$ echo < some_file.txt - содержимое файла в
качестве входных данных

$ head -n 5 - первые 5 строк (по умолчанию
10)
$ tail - полностью аналогично
Утилиты
$ locate <...> - быстрый поиск файлов
$ updatedb - обновить индекс для locate
$ locate -i - не учитывать регистр

$ grep -i - не учитывать регистр
$ grep -n - показывать номера строк
$ grep -v - все кроме
$ grep -l - только названия файлов
$ !! - выполнится предыдущая команда
Утилиты
$ alias - списко алиасов
$ alias ll=’ls -alF’ - пример алиаса

$ host <ip или домен>
Утилиты
$ 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}' - оставить
первую и третью колонку
Утилиты
$ sort file1 file2 | uniq - отсортировать
содержимое двух файлов без повторов

$ cd -  - перейти в предыдущую
директорию
Find
$ find . *.txt - найти txt-файлы, начиная
поиск с текущей директории

$ find /path -type d -exec chmod 0755 {} ;

$ find /path -type d | xargs chmod 0755
PHP не модно?

Тольковый словарь Даля

МОДА ж. франц. проходящий обычай;
  ́
временная, изменчивая прихоть в
житейском быту, в обществе
Почему PHP?
● Простота, простота и... щас внимание
  простота

● Плюс/минус один и тот же performance

● Отсутствие syntactic sugar
  компенсируется поддержкой прокаченных
  IDE (читай PHP Storm) и библиотеками

● В России Python и Ruby не
  промышленные языки.
Смысл?
php script.php param1 param2
$argv - массив входящих параметров
  $argv[0] - имя вызываемого скрипта

$argc - размер массива $argv

Параметры не должны начинаться с
одиночного деффиса
Для реальных пацанов
#!/usr/bin/php
<?php
 var_dump($argv);

Для надежности первую строчку можно
заменить:
#!/usr/bin/env php

Ограничений на название параметров нет
I/O
STDIN
STDOUT
STDERR

fwrite(STDERR, "stderrn");

$line = fgets(STDIN);
Особенности
● байт-код не кешируется, слишком много
  includ-ов не желательно
● В cli-режиме echo по умолчанию
  вызывает flush()
● Ошибке лучше выводить в STDERR, т.к.
  вывод программы может быть
  перенарпавлен куда-то еще и
  пользователь не увидит ошибку
● exit(NUM)
● string exec ( string $command [, array
  &$output [, int &$return_var ]] )
Особенности
● Даже если определить
  register_shutdown_function, то Ctrl+Z все
  равно не отловится
● Перед fork-ом нужно закрывать все
  соединения с БД
Почему PHP, а не BASH
● Гораздо ближе к C-образным языкам, а,
  значит, понятнее большинству
  программистам
● Мощная поддержка IDE
● Сложнее выстрелить себе в ногу. Гораздо
  строже относится к ошибкам.
● Может все, что может bash
● Гораздо больше возможностей
Вопросы
:)

Приручаем linux-консоль

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