Можно соединить поток вывода одной программы с потоком ввода другой

Философия Linux построена на парадигме «одна утилита для одной функции». Из этого вытекает тот факт, что в современных дистрибутивах Linux огромное множество различных утилит, каждая из которых обладает только необходимым минимумом функций, зато то, что она делает, делается хорошо.

Второй вывод из указанных принципов – настоятельная необходимость реализации возможности «передавать» результаты работы из одной программы в другую «внутри» операционной системы.

И такой механизм был найден. В Linux им стал механизм «потоков». Все процессы работают в рамках трех потоков – стандартный ввод (stdin), стандартный вывод (stdout) и стандартная ошибка (stderr). Под эти потоки системно зарезервирована нумерация – «0» для stdin, «1» для stdout и «2» для stderr.

Стандартный поток ввода принимает данные с клавиатуры или с потока вывода другого скрипта. Примеры рассмотрим ниже в данной статье.

По умолчанию поток stdout выводит данные на терминал пользователя.

рис.1

Стандартные потоки ввода/вывода в Linux. Урок 12.

Вывод stderr (стандартный вывод для ошибок) также показывает свои данные на экране терминала, но с одним отличием – он используется только если «что-то пошло не так», в случае штатного поведения программы ее вывод направляется на stdout.

рис.2

Перенаправление потоков

Вывод данных с любого из трех описанных потоков можно перенаправить в другой поток или в файл. Для этого зарезервированы спецсимволы перенаправления (< и >).

Двойное перенаправление дописывает данные с вывода к данным целевого объекта

Одинарный символ перенаправления заменяет содержимое целевого объекта на перенаправляемый вывод.

рис.3

Пайп-символы

Помимо перенаправления данных стандартных потоков ввода-вывод, в Linux реализована «передача» данных вывода одной программы на поток ввода другой программы. Для этого зарезервирован т.н. «пайп-символ», вертикальная черта (|). Например, в команде

history | grep touch

сначала на поток вывода передается история команд пользователя, затем эти данные передаются на вход утилите grep, которая отфильтровывает только те команды, что содержат слово «touch» и уже эти данные отображаются в терминале пользователя.

рис.4

Программы-фильтры

Это целый класс утилит, которые используются совместно с «пайп-символом» и служат для «выборки» данных. Наиболее популярные программы-фильтры:

  • find – используется для поиска файлов по имени
  • grep – отображает «отфильтрованный» текст, содержащий только те строки, в которых встречаются данные, поданные программе в качестве аргумента
  • tee – утилита «перенаправляет» входящий поток данных одному или нескольким «целевым» объектам. Это могут быть файлы, другие программы, потоки ввода-вывода и тп
  • tr – используется для поиска и замены текста
  • wc – подсчитывает сколько раз заданные в качестве аргумента символы встречаются в содержимом «целевого» объекта

Выводы

Резюмируя можно сказать, что понимание механизма потоков и работы системных перенаправлений крайне важно. Это безусловно поможет при создании программ, обслуживании серверов, или автоматизации рутинных процессов любого вида.

#7. Стандартные потоки ввода/вывода. Функции putchar() и getchar() | Язык C для начинающих

Источник: serverspace.ru

Потоки ввода вывода. Тема 2-3

Программирование на языке Python (§ 54 - § 61)

Потоки ввода-вывода
Принцип «потокового ввода-вывода»
следующий:
• В оперативной памяти средствами операционной
системы создаётся некоторый «промежуточный буфер»
для хранения данных, читаемых из файла,
устройства или записывания на него этих данных;
• Средствами программы, созданной прикладным
программистом, происходит чтение или запись
информации в этот буфер;
• Средствами операционной системы осуществляется
«синхронизация» этого буфера («потока данных») с
файлом или устройством;
• При создании или открытии файла для него
выделяется буфер в оперативной памяти компьютера,
а после закрытия файла этот буфер очищается.

3.

4.

5.

• При работе с потоками и файлами различают
буферизированный (с использование буфера) и
небуферизированный (без использования буферов) вводвывод.
• Буфер (buffer) представляет собой область оперативной
памяти для промежуточного хранения данных,
передаваемых между программой и внешним устройством.
• Вывод данных в поток с буфером приводит к выводу этих
данных в соответствующий файл только после заполнения
буфера.
• Вывод данных в небуферизованный поток приводит к
немедленному выводу в файл.

6.

Стандартные потоки ввода-вывода
«Стандартные потоки» присутствуют в операционной системе всегда и
никогда не удаляются из оперативной памяти:
• Стандартный поток ввода (обозначение: stdin, cin и др.) — используется
для ввода символьных данных в программу. По-умолчанию этот поток
закреплён за клавиатурой компьютера.
• Стандартный поток вывода (обозначается как: stdout, cout и др.) используется для вывода символьной информации, полученной в
результате работы программы в «штатном режиме». По-умолчанию этот
поток закреплён за экраном дисплея.
• Вывод данных на экран и чтение их с клавиатуры происходит потому, что
по умолчанию стандартные потоки ассоциированы с терминалом
пользователя. Это не является обязательным — потоки можно
подключать к чему угодно — к файлам, программам и даже устройствам.
В командном интерпретаторе ОС такая операция называется
перенаправлением.
• Стандартные потоки можно перенаправлять не только в файлы, но и на
вход других программ. Если поток вывода одной программы соединить с
потоком ввода другой программы, получится конструкция, называемая
каналом, конвейером или пайпом.

7.

Стандартные потоки ввода-вывода
Стандартный поток ошибок (обозначение: stderr, cerr и др.) используется для вывода символьных диагностических сообщений,
ошибок и предупреждений, возникших в результате работы
программы. По-умолчанию этот поток закреплён за экраном дисплея;
Примечание: стандартный поток и поток ошибок разделены в связи с
тем, что при перенаправлении вывода часто совсем не нужно
записывать в результаты работы программы диагностические
сообщения.
Стандартный поток печати (обозначение: stdprn и др.) — используется
для вывода результатов работы программы на печать. По-умолчанию
этот поток закреплён за текущим принтером в системе, подключённым
к порту LPT1. В настоящее время этот поток почти не используется,
поскольку чаще проще и безопаснее перенаправить стандартный
поток вывода на принтер, чем разделять потоки отдельно для экрана
и отдельно для принтера.
Все остальные потоки создаются или уничтожаются с помощью
функций открытия и закрытия файлов, на период
чтения/записи/добавления информации в эти файлы.

8.

Потоки ввода-вывода
• Поток данных – абстракция,
используемая для чтения или записи
данных в единой манере. Поддержка
потоков включена в большинство
языков программирования (С++, C#,
Java).
• Существует два типа потоков:
текстовые и двоичные.

Читайте также:
Какой программой проверить работу компьютера

9.

Текстовые потоки
Текстовые потоки — это последовательность
символов. В текстовых потоках некоторые
символы могут преобразовываться согласно
требованиям среды.
Поэтому может не быть однозначного
соответствия между записываемыми или
считываемыми символами и символами во
внешнем устройстве.
Например, символ новой строки может
преобразовываться в пару «возврат каретки перевод строки».

10.

Двоичный поток
Двоичный поток – это последовательность
байт, имеющих однозначное соответствие с
байтами
во
внешнем
устройстве
(преобразование символов не возникает).
Число байт, записанных или прочитанных из
внешнего устройства, совпадает с числом во
внешнем устройстве. Может добавляться
некоторое количество нулевых байт к
двоичному потоку.

11.

Файлы и потоки
В С++ каждый файл рассматривается как последовательный поток байтов.
1
2
3
4
5
6
7
8
9
10 11
12
13
14
Маркер конца файла – EOF (End Of File marker)
15
16
17
Маркер конца
файла

12.

Потоки ввода-вывода
Отличительные особенности применения
механизма потоков:
• буферизация при обменах с внешними
устройствами;
• независимость программы от файловой
системы конкретной операционной системы;
• контроль типов передаваемых данных;
• возможность удобного обмена для типов,
определенных пользователем.

13.

Потоки ввода-вывода С++
• Для использования стандартных потоков
ввода-вывода достаточно поместить в текст
программы препроцессорную процедуру:
#include
• Каждый раз при включении в программу
библиотеки iostream происходит
формирование объектов cin, cout, cerr, т.е.
создаются соответствующие стандартные
потоки.

14.

Извлечение из потока
Выполнение операции >> (извлечение из потока) заключается в
преобразовании последовательности символов потока в значение
типизированного объекта, частным случаем которого является
переменная базового типа int, long, double и т.д.
cin >> идентификатор;
Игнорирует пробелы, табы, переход на новые строки
Возвращает 0 если достигнут конец файла, т.е. EOF
Популярынй способ извлечение из потока:
while (cin >> grade)
Вместо операций можно использовать функцию:
c=cin.get();
. Считывает любой символ

15.

Извлечение из потока
• Функция getline извлекает данные из входного потока
до строкового разделителя, который не
записывается в получившийся массив данных.
cin.getline(stream, string, separator);
• где stream — это поток данных,
• string – переменная, в которую запишется строка
• separator – строковый разделитель, показывающий
на конец строки.
• Последний параметр функции можно опустить, тогда
будет задан сепаратор по умолчанию — ‘n’.

16.

Извлечение из потока
Пример:
Вместо операций можно использовать функцию: #include
cin.getline(stroka, size);
cin.getline(stroka, size, ‘’);
Определение конца файла потока
cin.eof()
void main() int size=50;
char stroka[size];
cin.getline(stroka,size);
>

17.

Включение в поток
• При выполнении операции осуществляется обратное преобразование –
типизированное значение выражения (int, float, char и
т.д.) трансформируется в последовательность
символов потока.
cout cout.put(‘A’);

18.

Сцепление операций
• cout . cin >> переменная1 >> переменная2
>>. >> переменная n;
setlocale(LC_ALL, «Russian»);
int curNumber = 0;
int curNumber2 = 0;
std::string line;
cin >> curNumber >> curNumber2;
cout

19.

Строковые потоки

• Для вывода в память строки существует
специализированный тип stringstream
• Как правило, строковый поток ввода инициируется
объектом класса string, а затем считывает из него
символы, используя операции ввода.
• И наоборот, строковый поток вывода инициируется
пустым объектом класса string, а затем заполняется
с помощью операций вывода.
• Строковый поток ввода-вывода обычно используется
для отделения собственно ввода-вывода от
обработки данных

20.

Строковые потоки
• stringstream strm; — создает несвязанный объект
класса stringstream;
• stringstream strm(s); — создает объект класса
stringstream, содержащий копию строки s;
• strm.str() — возвращает копию строки, которую
хранит объект strm;
• strm.str(s) — копирует строку s в объект strm,
• eof() – проверяет, достигнут ли конец потока,
• fail() – проверяет, произошла ли исправимая ошибка,
• bad() – проверяет, произошла ли исправимая ошибка

21.

#include
#include
using namespace std;
int main()
setlocale(LC_ALL, «Russian»);
int curNumber = 0;
std::string line;
while (std::getline(std::cin, line))
std::stringstream ss(line);
if (ss >> curNumber)
if (ss.eof())
break;
>
>
std::cout >
cout >

22.

Манипуляторы
• Манипуляторами называют специальные
функции, позволяющие программисту
изменять состояния и флаги потока.
• Особенность манипуляторов состоит в том,
что их имена (без параметров) и вызовы (с
параметрами) можно использовать в
качестве правого операнда для операции
обмена (>).
• В качестве левого операнда в этом
выражении, как обычно, используется поток
(ссылка на поток), и именно на этот поток
оказывает влияние манипулятор.

23.

Манипуляторы ввода/вывода
• Манипуляторы – это вспомогательные
функци, которые позволяют управлять
потоками ввода / вывода (например,
std::cin, std::cout).
• std::endl — новая строка и передача
данных из буфера на устройство (flush)
• Например,
std::cout std::cout std::endl;

24.

std::hex | std::oct | std::dec
• Выводят число в заданной системе
счисления.
• Находятся в заголовке
std::cout std::endl;
// a
std::cout std::endl; // 377
std::cout std::endl; // 505

25.

std::showbase |
std::noshowbase
• Отображают
выводимую систему
счисления
Находятся в
заголовке
• std::cout std::endl; // a
std::cout std::endl; // 0xa

26.

std::boolalpha | std::noboolalpha
Эти флаги управляют выводом выражений типа bool
Находятся в заголовке
#include
int main()
bool flag = true;
std::cout
std::cout
std::endl; //
std::cout
std::endl; //
>
<< std::boolalpha << flag << std::noboolalpha << flag <1

27.

std::showpoint |
std::noshowpoint
• Управляет отображением плавающей
точки (показывать / не показывать)
• Находятся в заголовке
std::cout std::endl; // 1.00000
std::cout std::endl; // 1

28.

std::showpos | std::noshowpos
• Отображает знак ‘+’ перед
положительными числами
• Находятся в заголовке
int value = 4;
std::cout std::cout std::showpos;
std::cout // +4

29.

std::skipws | std::noskipws
• Поток ввода пропускает / не
пропускает пробелы при
форматировании
Находятся в заголовке
char c1, c2, c3;
std::cin >> c1 >> c2 >> c3; // «a b c»
// c1 — a
// c2 — b
// c3 — c
std::cin >> std::noskipws >> c1 >> c2 >>
c3; // «a b c»
// c1 — a
// c2 — пробел
// c3 — b

30.

std::uppercase |
std::nouppercase
Данные флаги управляют регистром шестнадцатеричных чисел и экспоненциальных.
Находятся в заголовке
std::cout std::cout std::endl; // 0x1F
std::cout std::endl; // 0x1f

31.

std::setw(int n)
Старается выравнивать выводимые числа по заданной длине. По
умолчанию – по правому краю. Сбрасывается после использования.
Находятся в заголовке
std::cout // »
1002 12″

32.

33.

34.

35.

std::setprecision(int n)
• Устанавливает количество выводимых
разрядов в числе с плавающей точкой
• Находятся в заголовке
const long double pi = std::acos(-1.L);
std::cout std::setprecision(10) Вывод:
3.14159
3.141592654

36.

std::flush
• «Сбрасывает» данные из буфера
выходного потока. Результат может
быть не виден на конкретной машине,
так как стандарт С++ не
регламентирует, когда поток снова
«очистит» буфер, но при
использовании std::flush сброс обязан
произойти.
• Находятся в заголовке

Читайте также:
Написать программу которая проверяет является ли число палиндромом python

37.

std::quoted(const CharT *s)
[c++14]
Данный манипулятор выводит текст в кавычках.
Находятся в заголовке
char string[] = «test»;
std::cout // “test”

38.

39.

Обработка исключений
• Иногда при выполнении программы
возникают ошибки, которые трудно
предусмотреть или предвидеть.
• Такие ситуации называются исключениями.
Язык C++ предоставляет разработчикам
возможности для обработки таких ситуаций.
• Для этого в C++ предназначена конструкция
try. catch. finally.

40.

Исключения
• Это ошибки, возникающие во время
работы программы
• Они могут быть вызваны различными
обстоятельствами:
– выход за пределы памяти
– ошибка открытия файла
– попытка инициализировать объект
недопустимым значением
– использование индекса, выходящего за
пределы вектора

41.

Синтаксис исключений
Механизм обработки исключительных ситуаций основан на трех ключевых
словах: try, catch, throw
try // код, подлежащий контролю
// функции могут генерировать исключительные ситуации
// может содержать несколько оператор или целую программу
>
catch (тип1 аргумент) // перехват исключительных ситуаций
>
catch (тип2 аргумент) //
>

catch (типN аргумент) //
>

42.

throw исключительная ситуация;
Оператор throw генерирует указанную
исключительную ситуацию. Если в
программе есть ее перехват, оператор
throw должен выполняться либо внутри
блока try, либо внутри функции, явно или
неявно вызываемой внутри блока try
Если генерируется исключительная
ситуация, для которой НЕ
ПРЕДУСМОТРЕНА ОБРАБОТКА,
программа может прекратить свое
выполнение. В этом случае вызывается
стандартная функция terminate(), которая
по умолчанию вызывает функцию abort()

43.

44.

Исключения
• Код, который потенциально может сгенерировать
исключение помещается в блок try.
• Если ошибка исправлена, то выполнение программы
возобновляется с оператора, следующего за блоком
catch.
• Если исправить ошибку невозможно, то в блок catch
можно вызвать функции exit() или abort(), прекращает
выполнение программы
• Код блока catch выполняется только при перехвате
исключительной ситуации
• Исключительная ситуация может иметь любой тип, в том
числе быть объектом класса, определенного
пользователем
• Если необходимо обрабатывать не отдельные типы
исключительных ситуаций, а перехватывать все подряд,
то применяется следующий вид оператора catch:
catch (…)

45.

Исключения
•Все исключения в языке C++
описываются типом exception, который
определен в заголовочном
файле
•Если мы хотим отловить исключения
типа exception, то нам надо в выражении
catch определить переменную этого типа
catch (std::exception err)
• Все типы исключений имеют
метод what(), который возвращает
информацию об ошибке

46.

Исключения
runtime_error: общий тип исключений, которые возникают во время
выполнения
range_error: исключение, которое возникает, когда полученный результат
превосходит допустимый диапазон
overflow_error: исключение, которое возникает, если полученный результат
превышает допустимый диапазон
underflow_error: исключение, которое возникает, если полученный в
вычислениях результат имеет недопустимые отрицательное значение (выход
за нижнюю допустимую границу значений)
logic_error: исключение, которое возникает при наличии логических ошибок к
коде программы
domain_error: исключение, которое возникает, если для некоторого значения,
передаваемого в функцию, не определено результата
invalid_argument: исключение, которое возникает при передаче в функцию
некорректного аргумента
length_error: исключение, которое возникает при попытке создать объект
большего размера, чем допустим для данного типа
out_of_range: исключение, которое возникает при попытке доступа к элементам
вне допустимого диапазона

47.

Исключения
• Конструкция try. catch может
использовать несколько блоков catch
для обработки различных типов
исключений. При возникновении
исключения для его обработки будет
выбран тот, который использует тип
возникшего исключения.
• При использовании нескольких блоков
catch вначале помещаются блоки catch,
которые обрабатывают более частные
исключения, а только потом блоки catch
с более общими типами исключений

48.

Исключения
try // code to try
>
catch (exceptionType1
catch (exceptionType 2
catch (exceptionType3
.
Сработает только
/* далее код*/
первый по порядку!
(не switch)

Источник: ppt-online.org

Bash. Основы программирования

Цикл статей-памяток по разработке полезных утилит на bash По долгу профессии, мне, как программисту, необходимо автоматизировать свой рабочий процесс. Быстрые скриншоты с загрузкой на сервер, получение и обработка выделенного участка текста, парсинг данных, конвертация файлов и многое другое.. Источник в PDF  .

Из этой статьи вы узнаете (или вспомните) азы, необходимые для разработки простых bash сценариев.

Переменные

Переменные в bash могут содержаться в 3х областях видимости:

    Локальные переменные; Простая переменная внутри конкретного сценария. Например, определение переменной, доступ к значению и удаление:

path=»/home/user/stas/tmp.txt» echo -n $path # вывести значение переменной unset path # удалить переменную

Также, вы можете объявить локальную переменную внутри функции. Такая переменная будет доступна только внутри этой ф-ции:

local my_var;
export var_name
./some_script.sh VAL1 VAL2 # внутри сценария

Подстановка параметров и результата работы команд

Механизм подстановки команды (заключенная в апострофы или круглые скобки $(command) команды вернет значение в переменную, завершающие символы новой строки удаляются):

current_date=`date +%Y-%m-%d` # OR # current_date=$(date +%Y-%m-%d) echo $current_date # 2013-10-05

Получить результат значение переменной в другую переменную:

var=$ # все элементы массива

Примечание

При подстановке параметра — фигурные скобки не обязательны, они служат для отделения имени переменной от соседних символов и строк.

$(( арифметика ))

Раскрытие фигурных скобок

Раскрытие фигурных скобок — это механизм, с помощью которого можно генерировать строки произвольного вида. Генерация строки по шаблону (фигурные скобки могут быть вложенными):

echo spl #> spell spill spall

Условные операторы

Двойные квадратные скобки [[ . ]] bash интерпретирует как один элемент с кодом возврата. Внутри разрешается использование операторов и || .

## Однострочная запись [[ -f /dir/file ]] || < echo «File not exists»; exit 1; >## Вложенные условия if [ . ] [ . ]; then . elif [[ . . ]]; then . else . fi;

Пример проверки что переменная не пустая:

if [[ $some_var != » ]]; then echo ‘Переменная не пустая’ fi

Комбинированные условия с отрицанием:

if [ -f /path/file.png ] [ ! -z «$status» ]; then echo «Файл и переменная существуют» else echo «Нет файла или переменной» fi
case «$extension» in (html|htm) echo «Это HTML файл» ;; pdf) echo «Это PDF файл» ;; *) echo «Не известный тип файла: $extension» ;; esac

Условия сравнения

Смотрите доп. условия проверки файлов — https://www.tldp.org/LDP/abs/html/fto.html

### Файлы ### -e Проверить что файл существует (-f, -d) -f Файл существует (!-f — не существует) -d Каталог существует -s Файл существует и не пустой -r Файл существует и доступен на чтение -w . на запись -x . на выполнение -h Символическая ссылка -b Файл существует и является блочным устройством -с Файл существует и является символьным устройством (character device) -p Файл существует и является потоковым устройством (pipe device) -S Файл существует и является сокетом ### Строки ### -z Пустая строка -n Не пустая строка == Равно (!= не равно) ### Числа ### -eq Равно -ne Не равно -lt Меньше -le Меньше или равно -gt Больше -ge Больше или равно

Читайте также:
Программа сообщений как на Айфоне

Установка дефолтного значения переменной

Не работает для массивов!

Установка значения по умолчанию для аргумента:

SOME_VAR=$ # Если первый аргумент ($1) пустой — присвоить строку SOME_VAR=$ # Если аргумент $2 пустой — установить значение $default : $ # Если $my_var пустая — присвоить ей значение из $default

Установка дефолтного значения для существующей переменной:

TEST=’YES’ : $ echo $TEST # YES

Массивы и списки

IFS — разделитель элементов массива

При работе с массивами в качестве разделителя используется переменная IFS . При работе с массивами вы можете задать собственный разделитель — просто установив значение переменной IFS . Чтобы установить в качестве разделителя перенос каретки (окончание строки) задайте значение этой переменной: IFS=$’n’ .

Создание и наполнение массивов

files[0]=file.txt files[1]=image.png

Разбить строку по словам и создать массив (join array with delimiter):

IFS=’, ‘ read -r -a array
arr=(‘hello world’ other); IFSorigin=$IFS IFS=$’n’ echo «$» IFS=$IFSorigin

Создать массив из строки с указанием разделителя:

## Multiline content to array IFSorigin=$IFS IFS=$’n’ read -a arr «) IFS=$IFSorigin echo $

Добавить элементы в массив:

arr=(«$» «New element 1» «New element 2»)

Вывод элементов массива

Распечатать элементы массива ():

echo $ # распечатать элементы массива не учитывает IFS echo $ # распечатать элементы массива с IFS в качестве разделителя

Количество элементов массива:

Индекс случайного элемента массива:

rand_idx=$[RANDOM % $]

Вывести элементы массива через разделитель n :

printf — ‘%sn’ «$» # выведет разделитель после последнего элемента

Срезать/получить первый символ первого элемента массива:

Срезать первый элемент массива:

shift arr

Копировать массив (присвоить массив другой переменной):

new_arr=(«$»)

Проверить наличие элемента в массиве:

search_el=’some’ arr=(some elements in array) if [[ $ == $search_el ]]; then echo «Элемент $ найден» fi # if [[ $ == some ]]; then ; echo yes; else; echo no; fi

Обход массивов, списков, строк

Примечание

Цикл работает в отдельном потоке , поэтому будьте внимательны при доступе к внешним переменным.

Обойти элементы массива:

arr=(‘one’ ‘two words’) for el in «$»; do echo «$el» done

Обход списка файлов в каталоге:

for f in $HOME/tmp/*; do filename=$(basename «$f») extension=$ if [ «$filename» == «stop.txt» ]; then break fi if [ $extension != ‘png’ ]; then continue; fi echo $f done

Обход строк в многострочном тексте:

vendor/bin/propel database:reverse —help | while read line; do echo $line done echo «one;two» | tr «;» «n» | while read item; do echo $item done

Цикл while (сценарий проверки интернет соединения):

while [ true ]; do no_inet=`ping -q -c 1 ya.ru | grep «100% packet loss» | wc -l` if [ $no_inet -eq 0 ]; then echo «OK» sleep 5 else echo «Not connection» notify-send «Пропал интернет» «Нет соединения с интернетом» break fi done

Оператор select (выбор пользователем значения из списка):

select i in Laravel Symfony2 Silex; do case $i in Laravel) echo «Выбран $i»; break; ;; esac done

Функции

Функции в bash несколько урезанные, однако могут принимать аргументы, возвращать вычисленное значение и, все-таки позволяют исключить дублирование кода в скриптах. Ниже костяк ф-ции:

some_sunction() < # Объявляем переменную $str локальной и читаем в нее стандартный поток ввода local str read str first_argument=»$1″ second_argument=»$2″ # . тело функции # Или читаем построчно входной поток while read line; do # Возвращаем список строк для последующей обработки echo -n «$and $second_argument» done

Примечание

Если указать read несколько переменных, то в первую попадёт первое слово; во вторую — второе слово; в последнюю — всё остальное. Читать поток можно только внутри .

Функция вызывается как обычная команда:

echo ‘content’ | some_sunction arg1 arg2 some_var=’второй аргумент’ result=$(some_sunction ‘arg1’ «$some_var») # или так result=`some_sunction` return_code=$? # получить код возврата

Код возврата (завершения)

Каждая программа по завершению возвращает числовой код (статус) завершения в переменную окружения $? (от 0 до 255). При успешном выполнении команда возвращает код 0, в случае ошибки — код будет целым числом.

С помощью этой переменной вы можете проверять статус выполнения каждой необходимой программы или скрипта.

Примечание

Когда работа сценария завершается командой exit без параметров, то код возврата сценария определяется кодом возврата последней исполненной командой.

Потоки

Файл, из которого осуществляется чтение, называется стандартным потоком ввода, а в который осуществляется запись — стандартным потоком вывода.

0 stdin, ввод 1 stdout, вывод 2 stderr, поток ошибок

При перенаправлении потоков, вы можете указывать ссылки на определенные потоки. Например, перенаправим вывод и ошибки команды в файл:

command 2> ~/out.txt 2>> ~/out.txt # весь вывод в файл

Перенаправление потоков

Перенаправление потока вывода:

> перенаправить поток вывода в файл (файл будет создан или перезаписан) >> дописать поток вывода в конец файла

Перенаправление потока ввода (прием данных):

Перенаправление вывода ошибок:

2> перенаправить поток ошибок в файл 2>> дописать ошибки в файл (файл будет создан или перезаписан)

Примечание

Если вам нужно захватить вывод команды в переменную и при этом отобразить вывод на экране, используйте tee :

my_var=$(my_script.sh | tee /dev/tty)

Подстановка процессов

Передать процессу команда1 файл (созданный налету канал или файл /dev/fd/. ), в котором находятся данные, которые выводит команда2:

команда1

Примеры

Логировать результат поиска и ошибки:

find . -maxdepth 1 -name ‘*.png’ > ~/result.txt 2> ~/errors.txt

Эта конструкция позволяет читать из строки как из файла. Демонстрационный пример:

str=’one,two’; tr ‘,’ ‘ ‘

Создаем временный файл и записываем в него поток переданный скрипту:

tmp_file=$(tempfile) # /tmp/fileXXXXXX cat > $tmp_file

А теперь откроем файл в текстовом редакторе с «отвязкой» (отключением) от терминала, подавляем вывод сообщений в терминал:

(sublime-text $tmp_file /dev/null > /dev/null

Каналы

Стандартные потоки можно перенаправлять не только в файлы, но и на вход других программ. Если поток вывода одной программы соединить с потоком ввода другой программы, получится конструкция, называемая каналом, конвейером или пайпом (от англ. pipe, труба).

Объединяем потоки команд в канал:

cmd1 | cmd2 | cmd3

Здесь стандартный поток вывода cmd1 подключен к входному потоку cmd2 , поток вывода cmd2 будет передан на вход cmd3 .

Конвееры

В составных командах и цепочке конвееров используются операторы управления ; , , || . Тут все довольно просто, главное запомнить алгоритм и порядок, по которому работают эти операторы:

1. Команда cmd2 будет выполнена по завершении команды cmd1 не зависимо от результата работы cmd1 :

cmd1; cmd2

2. Команда cmd2 будет выполнена после успешного выполнения cmd1 (код завершения = 0):

cmd1 cmd2

3. Команда cmd2 будет выполнена, если код завершения cmd1 отличен от 0 (произошла ошибка):

cmd1 || cmd2

#bash, #conditions, #pipe, #array

Источник: onedev.net

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru