English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Перенаправление ввода/вывода Shell

Большинство команд UNIX системы принимают ввод с вашего терминала и отправляют созданный вывод обратно в ваш терминал. Команда обычно читает ввод из места, называемого стандартным вводом, по умолчанию это ваш терминал. Точно так же команда обычно записывает вывод в стандартный вывод, по умолчанию это также ваш терминал.

Список команд перенаправления:

Команда Объяснение
command > file Вывод будет перенаправлен в файл.
command < file Вход будет перенаправлен в файл.
command >> file Вывод будет перенаправлен в файл с помощью метода добавления.
n > file Файл с описателем файла n будет перенаправлен в файл.
n >> file Файл с описателем файла n будет перенаправлен в файл с помощью метода добавления.
n >& m Объедините выходные файлы m и n.
n <& m Объедините входные файлы m и n.
<< tag Используйте содержимое между началом метки tag и концом метки tag в качестве ввода.

需要注意的是, файловый дескриптор 0 обычно является стандартным вводом (STDIN), 1 - стандартным выводом (STDOUT), 2 - стандартным выводом ошибок (STDERR).

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

Перенаправление выполняется, вставляя специфические символы между командами. Специфические символы имеют следующий синтаксис:

command1 > file1

Эта команда выполняет command1 и сохраняет результат в file1.

Внимание: содержимое file1, уже существующее, будет overwritten новым содержимым. Если вы хотите добавить новый контент в конец файла, используйте оператор >>.

Онлайн пример

Выполните следующую команду who, которая перенаправит полный вывод команды в файл users (users):

$ who > users

После выполнения команды, информация не выводится в терминал, потому что вывод был перенаправлен в указанный файл.

Вы можете использовать команду cat, чтобы просмотреть содержимое файла:

$ cat users
_mbsetupuser console  Oct 31 17:35 
tianqixin    console  Oct 31 17:35 
tianqixin    ttys000  Dec  1 11:33

Перенаправление вывода будет overwrite содержимое файла, см. следующий пример:

$ echo "Сайт основного руководства: ru.oldtoolbag.com" > users
$ cat users
Сайт основного руководства: ru.oldtoolbag.com
$

Если вы не хотите, чтобы содержимое файла было overwritten, вы можете использовать '>>', чтобы добавить к концу файла, например:

$ echo "Сайт основного руководства: ru.oldtoolbag.com" >> users
$ cat users
Сайт основного руководства: ru.oldtoolbag.com
Сайт основного руководства: ru.oldtoolbag.com
$

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

Как и перенаправление вывода, Unix-команды также могут получать ввод из файла, синтаксис следующий:

command1 < file1

Таким образом, команда, которая обычно требует ввода с клавиатуры, будет перенаправлена на чтение из файла.

Внимание: перенаправление вывода выполняется с помощью знака '>', а перенаправление ввода - с помощью знака '<'.

Онлайн пример

Продолжая примеры выше, нам нужно посчитать количество строк в файле users, для этого выполните следующую команду:

$ wc -l users
       2 users

Ввод можно также перенаправить в файл users:

$ wc -l < users
       2

Внимание: результаты первых двух примеров различаются: в первом примере выводится имя файла; во втором нет, потому что он знает только о чтении содержимого из стандартного ввода.

command1 < infile > outfile

Одновременно заменять ввод и вывод, выполнять command1, читать содержимое из файла infile и затем写入 вывод в outfile.

Глубокое изучение перенаправления

В общем случае, при выполнении каждого Unix/Linux-команды открываются три файла:

  • Стандартный файл ввода (stdin):Файловый дескриптор stdin равен 0, Unix-программы по умолчанию читают данные из stdin.

  • Стандартный файл вывода (stdout):Файловый дескриптор stdout равен 1, Unix-программы по умолчанию отправляют данные в stdout.

  • Стандартный файл ошибок (stderr):Файловый дескриптор stderr равен 2, Unix-программы пишут ошибки в поток stderr.

По умолчанию, command > file перенаправляет stdout в file, command < file перенаправляет stdin в file.

Если нужно перенаправить stderr в файл, можно написать так:

$ command 2>file

Если нужно добавить stderr в конец файла file, можно написать так:

$ command 2>>file

2 Это означает стандартный файл ошибок (stderr).

Если нужно перенаправить stdout и stderr в файл, можно написать так:

$ command > file 2>&1
или
$ command >> file 2>&1

Если нужно перенаправить stdin и stdout, можно написать так:

$ command < file1 >file2

Команда command перенаправляет stdin в file1, а stdout в file2.

Here Document

Here Document — это особый способ перенаправления ввода в Shell, который используется для перенаправления ввода в интерактивный скрипт или программу Shell.

Его базовая форма выглядит следующим образом:

command << delimiter
    document
delimiter

Его действие заключается в передаче содержимого (document) между двумя delimiter в качестве входных данных для команды.

Внимание:

  • delimiter в конце должен быть выровнен по левому краю, перед ним не должно быть ни одного символа, ни после него, включая пробелы и отступы tab.

  • Пропускуются пробельные символы перед и после delimiter.

Онлайн пример

В командной строке можно вычислить количество строк Here Document с помощью команды wc -l:

$ wc -l << EOF
    Добро пожаловать
    Сайт основного учебника
    ru.oldtoolbag.com
EOF
3          # Результат вывода 3 строки
$

Мы также можем использовать Here Document в скриптах, например:

#!/bin/bash
# author:Сайт основного учебника
# url:ru.oldtoolbag.com
cat << EOF
Добро пожаловать
Сайт основного учебника
ru.oldtoolbag.com
EOF

Исполнение вышеуказанного скрипта, результат вывода:

Добро пожаловать
Сайт основного учебника
ru.oldtoolbag.com

файл /dev/null

Если вы хотите выполнить команду, но не хотите, чтобы结果显示ался на экране, можно перенаправить вывод в /dev/null:

$ command > /dev/null

/dev/null - это специальный файл, в который写入的内容 всегда丢弃аются; если пытаться прочитать из этого файла, то не будет получено ничего. Но файл /dev/null очень полезен, так как перенаправление команд в него создает эффект "запрета вывода".

Если вы хотите скрыть stdout и stderr, можно написать так:

$ command > /dev/null 2>&1

Внимание:0 - это стандартный ввод (STDIN), 1 - стандартный вывод (STDOUT), 2 - стандартный вывод ошибок (STDERR).

здесь 2 и > между ними не должно быть пробелов,2> Ошибка вывода отображается только когда они являются единым целым.