Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
spo_voprosy.docx
Скачиваний:
9
Добавлен:
20.03.2016
Размер:
465.35 Кб
Скачать

IV. Pipes and commands

Одним из полномочий командной строки Unix является использование перенаправлений и пайпов (pipes, конвейеров/труб/потоков). Эта глава сначала объяснит перенаправление входящих и исходящих потоков, а так же потоков ошибок. И затем представит пайпы, которые состоят из нескольких команд.

  1. stdin, stdout and stderr. Shell (как и почти любая другая команда Linux) забирает входящие данные из stdin (поток 0) направляет исходящие данные в stdout (поток 1) и сообщения об ошибках в stderr (поток 2).

Часто клавиатура служит стандартным вводом для stdin, а стандартным выводом для stdout и stderr служит монитор. Shell позволяет вам перенаправлять эти потоки.

  1. Перенаправление исходящего потока. Stdout может быть перенаправлен с помощью знака больше. Когда происходит сканирование строки, shall увидит знак > и очистит файл.

[paul@RHELv4u3 ~]$ echo It is cold today!

It is cold today!

[paul@RHELv4u3 ~]$ echo It is cold today! > winter.txt

[paul@RHELv4u3 ~]$ cat winter.txt

It is cold today!

[paul@RHELv4u3 ~]$

Обратите внимание, что знак > на самом деле является аббревиатурой от 1> (stdout именуется потоком 1).

Повторим: Когда происходит сканирование строки, shall увидит знак > и очистит файл. Это значит, что даже если команда не будет выполнена, файл будет очищен!

[paul@RHELv4u3 ~]$ cat winter.txt

It is cold today!

[paul@RHELv4u3 ~]$ zcho It is cold today! > winter.txt

-bash: zcho: command not found

[paul@RHELv4u3 ~]$ cat winter.txt

[paul@RHELv4u3 ~]$

Очистка файла использованием > может быть предотвращена установкой опции noclobber.

[paul@RHELv4u3 ~]$ cat winter.txt

It is cold today!

[paul@RHELv4u3 ~]$ set -o noclobber

[paul@RHELv4u3 ~]$ echo It is cold today! > winter.txt

-bash: winter.txt: cannot overwrite existing file

[paul@RHELv4u3 ~]$ set +o noclobber

[paul@RHELv4u3 ~]$

Noclobber может быть отменен с помощью >|.

[paul@RHELv4u3 ~]$ set -o noclobber

[paul@RHELv4u3 ~]$ echo It is cold today! > winter.txt

-bash: winter.txt: cannot overwrite existing file

[paul@RHELv4u3 ~]$ echo It is very cold today! >| winter.txt

[paul@RHELv4u3 ~]$ cat winter.txt

It is very cold today!

[paul@RHELv4u3 ~]$

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

[paul@RHELv4u3 ~]$ echo It is cold today! > winter.txt

[paul@RHELv4u3 ~]$ cat winter.txt

It is cold today!

[paul@RHELv4u3 ~]$ echo Where is the summer ? >> winter.txt

[paul@RHELv4u3 ~]$ cat winter.txt

It is cold today!

Where is the summer ?

[paul@RHELv4u3 ~]$

  1. Перенаправление ошибок

2> stderr.

Перенаправление stderr происходит с помощью 2>. Это может быть очень полезным, чтобы избежать того, что сообщения об ошибке загромоздили весь экран. Пример внизу показывает перенаправление stdout в файл и stderr в /dev/null. Написание 1> имеет тот же смысл что и >.

[paul@RHELv4u3 ~]$ find / > allfiles.txt 2> /dev/null

[paul@RHELv4u3 ~]$

2>&1

Чтобы перенаправить оба потока сразу в 1 файл используйте 2>&1.

[paul@RHELv4u3 ~]$ find / > allfiles_and_errors.txt 2>&1

[paul@RHELv4u3 ~]$

Обратите внимание, что порядок в данном случае имеет значение. Например, команда

ls > dirlist 2>&1

направляет оба вывода (и стандартный вывод, и стандартные ошибки) в файл dirlist, в то время как команда

ls 2>&1 > dirlist

перенаправляет только стандартный вывод в файл dirlist, потому что стандартный вывод ошибок сделал копию адреса стандартного вывода до того, как стандартный вывод был перенаправлен в dirlist.

  1. Перенаправление ввода.

Перенаправление ввода делается с помощью < (сокращение от 0<).

[paul@RHEL4b ~]$ cat < text.txt

one

two

[paul@RHEL4b ~]$ tr 'onetw' 'ONEZZ' < text.txt

ONE

ZZO

[paul@RHEL4b ~]$

«Здесь» документ (<<here document) это способ задания ввода до того как определенная последовательность (обычно EOF) не встретится. Маркер EOF может быть введен буквально или может быть вызван сочетанием клавишь Ctrl-D.

[paul@RHEL4b ~]$ cat <<EOF > text.txt

> one

> two

> EOF

[paul@RHEL4b ~]$ cat text.txt

one

two

[paul@RHEL4b ~]$ cat <<brol > text.txt

> brel

> brol

[paul@RHEL4b ~]$ cat text.txt

brel

[paul@RHEL4b ~]$

«Здесь» строка (<<<here string), может быть использована, чтобы напрямую передавать строки команде. Результат такой же, как при использовании echo string | command (но так будет на один меньше запущенный процесс).

paul@ubu1110~$ base64 <<< linux-training.be

bGludXgtdHJhaW5pbmcuYmUK

paul@ubu1110~$ base64 -d <<< bGludXgtdHJhaW5pbmcuYmUK

linux-training.be

Просмотрите rfc 3548 для большей информации о base64.

  1. Смешанное перенаправление (confusing redirection).

Shell будет сканировать всю строку до тех пор, пока не будет принято перенаправление. Следующая команда вполне читаема и правильна.

cat winter.txt > snow.txt 2> errors.txt

Однако эта команда тоже правильна, хотя и хуже читается.

2> errors.txt cat winter.txt > snow.txt

Даже эту запись shell прекрасно поймет

< winter.txt > snow.txt 2> errors.txt cat

  1. Быстрая очистка файла

Итак, какой самый быстрый способ очистить файл?

>foo

И какой же самый быстрый способ очистить файл, когда nocobbler активирован?

>|bar

  1. Перемена stdout и stderr

При фильтрации выходного потока, например через обычный канал (|) вы можете только фильтровать стандартный вывод stdout. Скажем, вам надо отфильтровать некоторые незначительные ошибки из потока stderr. Это не может быть сделано напрямую и вам нужно поменять местами (swap) stdout и stderr. Это может быть сделано непосредственно с помощью четвертого потока с номером 3:

3>&1 1>&2 2>&3 # в 3 копируется 1, в 1 копируется 2, в 2 копируется 3

Эта подобная Башне Ханоя (перемещение возможно только через третий, временный пункт) инструкция использует временный поток 3, чтобы иметь возможность обменять stdout (1) и stderr(2). Ниже приведен пример того, как отфильтровать все записи в потоке stderr, содержащие $error.

$command 3>&1 1>&2 2>&3 | grep -v $error 3>&1 1>&2 2>&3

Но в этом примере это может быть сделано куда боле коротким путем, используя пайп на STDERR:

/usr/bin/$somecommand |& grep -v $error

15.8 Pipes(англ. – трубы/конвейеры)

Один из самых больших преимуществ Linux является использование пайпов.

Пайп занимает стандартный вывод предыдущей команды и посылает его в качестве стандартного ввода для следующей команды. Все команды в пайпах выполняются одновременно.

| Вертикальная черта

Рассмотрим следующий пример.

paul@debian5:~/test$ ls /etc > etcfiles.txt

paul@debian5:~/test$ tail -4 etcfiles.txt

X11

xdg

xml

xpdf

paul@debian5:~/test$

Это можно записать в одной командной строке с помощью пайпа:

paul@debian5:~/test$ ls /etc | tail -4

X11

xdg

xml

xpdf

paul@debian5:~/test$

Пайп представлен ​​вертикальной чертой | между двумя командами.

Несколько пайпов.

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

paul@deb503:~/test$ ls /etc | tail -4 | tac

xpdf

xml

xdg

X11

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]