Приручаем linux-консоль
TRANSCRIPT
Приручаем 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/bashprintf "%s\n" "Hello, World"
Позиционные параметры
printf "Hello, %s!\n" "$1"
$ hello JohnHello, John!$ hello SusanHello, Susan!
$1 - $9${15}
Специальные параметры
$# - кол-во входных параметров$$ - идентификатор процесса?$ - код завершения последней выполненной команды
Переменные
name=VALUE
printf
$ printf "%s\n" Print arguments on "separate lines"Printargumentsonseparate 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 bSun Mon$ echo $aSun$ echo $bMon
Командная подстановка
$ date=`date` - старый синтаксис$ date=$( date ) - новый$ wc -l $( date +%Y-%m-%d ).log
$ printf -v num4 "%04d" 4$ printf "%s\n" "$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 nameif [ -z "$name" ]then echo "No name entered" >&2 exit 1elif [ "$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=1while [ $n -le 10 ]do echo "$n" n=$(( $n + 1 ))done
For
for (( n=1; n<=10; ++n ))do echo "$n"done
breakcontinue
Конкатенация
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 не модно?
Тольковый словарь Даля
МО́ДА ж. франц. проходящий обычай; временная, изменчивая прихоть в житейском быту, в обществе
● Простота, простота и... щас внимание простота
● Плюс/минус один и тот же performance
● Отсутствие syntactic sugar компенсируется поддержкой прокаченных IDE (читай PHP Storm) и библиотеками
● В России Python и Ruby не промышленные языки.
Почему PHP?
Смысл?
php script.php param1 param2
$argv - массив входящих параметров$argv[0] - имя вызываемого скрипта
$argc - размер массива $argv
Параметры не должны начинаться с одиночного деффиса
Для реальных пацанов
#!/usr/bin/php<?php var_dump($argv);
Для надежности первую строчку можно заменить:#!/usr/bin/env php
Ограничений на название параметров нет
I/O
STDINSTDOUTSTDERR
fwrite(STDERR, "stderr\n");
$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● Гораздо больше возможностей
Вопросы
:)