- •II. First steps on the command line
- •5. Man pages
- •6. Working with directories (работа с папками)
- •7.Working with files
- •8. Working with file contents
- •9. The Linux file tree
- •III. Shell expansion
- •10. Commands and arguments
- •11. Control operators
- •12. Variables
- •13. Shell history
- •14. File globbing
- •IV. Pipes and commands
- •Глава 16. Фильтры.
- •16.3 Grep
- •16.7. Sort
- •16.8. Uniq
- •16.9. Comm
- •16.12. Примеры пайпов
- •Глава 17. Основные инструменты Unix
- •17.1. Find
- •17.2. Размещение
- •17.3. Date
- •17.5. Sleep
- •17.6. Time
- •17.7. Gzip - gunzip
- •17.8. Zcat - zmore
- •18.3. Замена и удаление символов (r X X)
- •18.4. Отменить и повторить (u .)
- •18.5. Вырезать, копировать и вставить строчки (dd yy p p)
- •18.6. Вырезать, копировать и вставить строчки (3dd 2yy)
- •18.8. Объединения двух и более линий (j)
- •18.9. Слова (w b)
- •18.10. Сохранить (или нет) и выход (:w :q :q! )
- •18.11. Поиск (/ ?)
- •18.13. Чтение файлов (:r :r !cmd)
- •19.1. Предпосылки
- •19.2. Hello World
- •19.4. Комментарии
- •20.2. Если, затем, иначе (if then else)
- •20.3. If then elif
- •20.4. For loop
- •20.5. While loop
- •21.2. Shift through parameters.
- •21.3. Runtime input.
- •21.3. Sourcing a config file.
- •21.5. Get script options with getopts.
- •21.6. Get shell options with shopt.
- •Глава 22 More scripting.
- •22.1. Eval.
- •22.4. Case.
- •22.5. Shell functions.
- •Раздел VII. Local user management. Глава 23. Users.
- •23.1. Identify yourself.
- •23.2. Users.
- •23.3. Passwords.
- •23.4 Home directories
- •23.5 User shell
- •23.6. Switcj users with su
- •23.7 Run a program as another user
- •23.10 Shell environment
- •Глава 24. Groups
- •24.1 About groups
- •24.2 Groupadd
- •24.3 /Etc/group
- •24.4 Usermod
- •24.5 Groupmod
- •24.6 Groupdel
- •24.7 Groups
- •24.8 Gpasswd
- •24.9 Vigr
IV. Pipes and commands
Одним из полномочий командной строки Unix является использование перенаправлений и пайпов (pipes, конвейеров/труб/потоков). Эта глава сначала объяснит перенаправление входящих и исходящих потоков, а так же потоков ошибок. И затем представит пайпы, которые состоят из нескольких команд.
stdin, stdout and stderr. Shell (как и почти любая другая команда Linux) забирает входящие данные из stdin (поток 0) направляет исходящие данные в stdout (поток 1) и сообщения об ошибках в stderr (поток 2).
Часто клавиатура служит стандартным вводом для stdin, а стандартным выводом для stdout и stderr служит монитор. Shell позволяет вам перенаправлять эти потоки.
Перенаправление исходящего потока. 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 ~]$
Перенаправление ошибок
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.
Перенаправление ввода.
Перенаправление ввода делается с помощью < (сокращение от 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.
Смешанное перенаправление (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
Быстрая очистка файла
Итак, какой самый быстрый способ очистить файл?
>foo
И какой же самый быстрый способ очистить файл, когда nocobbler активирован?
>|bar
Перемена 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