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

48
Приручаем linux- консоль Сергей Коржнев 2ГИС

Upload: 2-

Post on 26-Jun-2015

576 views

Category:

Documents


1 download

TRANSCRIPT

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

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

Сергей Коржнев2ГИС

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

О чем доклад?

● Научимся читать bash-код● Пробежимся по нескольким полезным

консольным утилитам● Развенчиваем миф, что php уже не торт● Убедимся, что php в 100500 раз

практичнее bash-а для консольных приложений

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

Основы bash

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

$PATH

$ echo $PATH/bin:/usr/bin:/usr/local/bin:/usr/games

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

$ type <command> - информация о команде

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

Hello World

#!/bin/bashprintf "%s\n" "Hello, World"

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

Позиционные параметры

printf "Hello, %s!\n" "$1"

$ hello JohnHello, John!$ hello SusanHello, Susan!

$1 - $9${15}

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

Специальные параметры

$# - кол-во входных параметров$$ - идентификатор процесса?$ - код завершения последней выполненной команды

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

Переменные

name=VALUE

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

printf

$ printf "%s\n" Print arguments on "separate lines"Printargumentsonseparate lines

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

Спецификаторы printf

%s - строка%d - целое число%f - дробное число%b - строка, обрабатывающая escape-последовательности

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

I/O

$ printf "" > FILENAME - stderr все равно в монитор

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

$ printf "" > FILENAME 2>&1 - оба потока в один файл

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

Reading Input

$ read a bSun Mon$ echo $aSun$ echo $bMon

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

Командная подстановка

$ date=`date` - старый синтаксис$ date=$( date ) - новый$ wc -l $( date +%Y-%m-%d ).log

$ printf -v num4 "%04d" 4$ printf "%s\n" "$num4"0004

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

Статус выхода

$ printf "%v"-bash: printf: v': недопустимый символ форматирования$ echo $?1

0 - истина!0 - ложь

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

Сравнение целых

$ test 1 -eq 1$ echo $?0

$ [ 2 -eq 1 ]$ echo $?1

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

Сравнение целых

-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-консоль

Сравнение строк

$ test "$a" = "$b" $ [ "$q" != "$b" ](кроме NIL (ASCII 0))

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

$ test -n "" - false - Is not empty ?

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

Еще опции

test -d "$directory" && cd "$directory"[ -d "$dir"] && cd "$dir"

man test - все тут!

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

Арифметическое выражение

$ test $(( 2-2 )) -ne 0$ echo $?1

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

If

if <condition list>then <list>fi

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

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-консоль

If

if test -d "$dir" && cd "$dir"then echo "$PWD"fi

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

Case

case WORD in PATTERN) COMMANDS ;; PATTERN) COMMANDS ;; ## optional

case $1 in *"$2"*) true ;; *) false ;;esac

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

While

while <list>do <list>done

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

While

n=1while [ $n -le 10 ]do echo "$n" n=$(( $n + 1 ))done

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

For

for (( n=1; n<=10; ++n ))do echo "$n"done

breakcontinue

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

Конкатенация

a=$HOME/bin

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

Построчное чтение файла

cat data | while read a; do echo $a; done

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

Полезняшки

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

Утилиты

$ mkdir -p dir1/dir2/dir3 - создаст вложенные директории

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

$ cp -R <...> - копирует каталоги тоже

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

Утилиты

$ which top/usr/bin/top

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

$ head -n 5 - первые 5 строк (по умолчанию 10)$ tail - полностью аналогично

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

Утилиты

$ locate <...> - быстрый поиск файлов$ updatedb - обновить индекс для locate$ locate -i - не учитывать регистр

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

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

Утилиты

$ alias - списко алиасов$ alias ll=’ls -alF’ - пример алиаса

$ host <ip или домен>

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

Утилиты

$ 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-консоль

Утилиты

$ sort file1 file2 | uniq - отсортировать содержимое двух файлов без повторов

$ cd - - перейти в предыдущую директорию

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

Find

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

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

$ find /path -type d | xargs chmod 0755

Page 37: Приручаем linux-консоль
Page 38: Приручаем linux-консоль
Page 39: Приручаем linux-консоль

PHP не модно?

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

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

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

● Простота, простота и... щас внимание простота

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

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

● В России Python и Ruby не промышленные языки.

Почему PHP?

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

Смысл?

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

php script.php param1 param2

$argv - массив входящих параметров$argv[0] - имя вызываемого скрипта

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

Параметры не должны начинаться с одиночного деффиса

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

Для реальных пацанов

#!/usr/bin/php<?php var_dump($argv);

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

Ограничений на название параметров нет

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

I/O

STDINSTDOUTSTDERR

fwrite(STDERR, "stderr\n");

$line = fgets(STDIN);

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

Особенности

● байт-код не кешируется, слишком много includ-ов не желательно

● В cli-режиме echo по умолчанию вызывает flush()

● Ошибке лучше выводить в STDERR, т.к. вывод программы может быть перенарпавлен куда-то еще и пользователь не увидит ошибку

● exit(NUM) ● string exec ( string $command [, array

&$output [, int &$return_var ]] )

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

● Даже если определить register_shutdown_function, то Ctrl+Z все равно не отловится

● Перед fork-ом нужно закрывать все соединения с БД

Особенности

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

Почему PHP, а не BASH

● Гораздо ближе к C-образным языкам, а, значит, понятнее большинству программистам

● Мощная поддержка IDE● Сложнее выстрелить себе в ногу. Гораздо

строже относится к ошибкам.● Может все, что может bash● Гораздо больше возможностей

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

Вопросы

:)