Перенаправление ввода/вывода в Linux (Ubuntu)

    Команда Simple-Server
    03.06.2026
    11 мин

    Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.

    Кратко о задаче

    Когда команда выполняется без каких-либо ошибок, создаваемый вывод называется стандартным выводом, также называемым STDOUT. По умолчанию этот вывод будет отправлен на терминал, где выполняется команда.

    Стандартный вывод можно перенаправить из команды, чтобы он перешел к файлу, а не к терминалу. Стандартное перенаправление вывода достигается выполнением команды с символом больше > и конечным файлом. Например, команда ls ~ выведет список файлов в домашнем каталоге. Чтобы сохранить список файлов в домашнем каталоге, вы должны направить вывод в текстовый файл.

    Simple-Server@localhost:~$ ls ~ > /tmp/home.txt

    После чего содержимое файла home.txt будет иметь следующий вид:

    Simple-Server@localhost:~$cat /tmp/home.txt Desktop Documents Downloads Music Pictures Public Templates Videos

    Перенаправление вывода с использованием одного символа больше > создаст новый файл или перезапишет содержимое существующего файла с тем же именем. Перенаправление стандартного вывода с двумя символами больше > > также создаст новый файл, если он не существует. Разница в том, что при использовании символов > > вывод команды будет добавлен в конец файла, если он уже существует. Например, чтобы добавить в конец файла вывод команды date, выполните следующее:

    Simple-Server@localhost:~$ date >> /tmp/home.txt   Simple-Server@localhost:~$cat /tmp/home.txt Desktop Documents Downloads Music Pictures Public Templates Videos Sun Jan 30 17:36:02 UTC 2022

    Когда команда обнаруживает ошибку, она выдает вывод, известный как стандартная ошибка, также называемая**** stderr или STDERR. Как и стандартный вывод, стандартный вывод ошибок обычно отправляется на тот же терминал, где в данный момент выполняется команда. Число, связанное со стандартным дескриптором файла ошибок, равно 2.

    Если вы попытаетесь выполнить команду ls /junk , то эта команда выдаст стандартные сообщения об ошибках, поскольку каталога /junk не существует.

    Simple-Server@localhost:~$ ls /junk ls: cannot access /junk: No such file or directory

    Поскольку этот вывод переходит в стандартную ошибку, один только символ больше > не будет успешно перенаправлять его, и вывод команды все равно будет отправлен на терминал:

    Simple-Server@localhost:~$ ls /junk > output ls: cannot access /junk: No such file or directory

    Чтобы перенаправить эти сообщения об ошибках, вы должны использовать правильный дескриптор файла, который для стандартной ошибки имеет номер 2. Выполните следующее, и ошибка будет перенаправлена в файл /tmp/ls.err:

    Simple-Server@localhost:~$ ls /junk 2> /tmp/ls.err

    Как и при стандартном выводе, использование одного символа > для перенаправления либо создаст файл, если он не существует, либо уничтожит (перезапишет) содержимое существующего файла. Чтобы предотвратить стирание существующего файла при перенаправлении стандартной ошибки, вместо этого используйте двойные символы > > после числа 2 для добавления:

    Simple-Server@localhost:~$ ls /junk 2>> /tmp/ls.err

    Некоторые команды будут выводить как stdout, так и stderr:

    Simple-Server@localhost:~$ find /etc -name passwd /etc/pam.d/passwd /etc/passwd find: '/etc/ssl/private': Permission denied

    Эти два разных вывода можно перенаправить в два отдельных файла, используя следующий синтаксис:

    Simple-Server@localhost:~$ find /etc -name passwd > /tmp/output.txt 2> /tmp/error.txt

    Команду cat можно использовать для проверки успешности перенаправления выше:

    Simple-Server@localhost:~$ cat /tmp/output.txt /etc/pam.d/passwd /etc/passwd Simple-Server@localhost:~$ cat /tmp/error.txt find: '/etc/ssl/private': Permission denied

    Иногда бесполезно отображать сообщения об ошибках в терминале или сохранять их в файле. Чтобы не сохранять эти сообщения об ошибках, используйте файл /dev/null.

    Файл /dev/null похож на мусорное ведро, где все отправленное в него исчезает из системы; его иногда называют черной дырой. Любой тип вывода может быть перенаправлен в файл /dev/null; чаще всего пользователи перенаправляют стандартную ошибку в этот файл, а не в стандартный вывод.

    Синтаксис использования файла /dev/null такой же, как и для перенаправления на обычный файл:

    Simple-Server@localhost:~$ find /etc -name passw 2> /dev/null /etc/pam.d/passwd /etc/passwd

    Что, если вы хотите, чтобы весь вывод (стандартная ошибка и стандартный вывод) отправлялся в один файл? Существует два метода перенаправления как стандартных ошибок, так и стандартных выходов:

    Simple-Server@localhost:~$ ls > /tmp/ls.all 2>&1 Simple-Server@localhost:~$ ls &> /tmp/ls.all

    Обе предыдущие командные строки создадут файл с именем /tmp/ls.all, содержащий все стандартные выходные данные и стандартные ошибки. Первая команда перенаправляет стандартный вывод на /tmp/ls.all, а выражение 2 >&1 означает «отправлять stderr туда, куда направляется stdout». Во втором примере выражение & > означает «перенаправить весь вывод».

    Стандартный ввод, также называемый stdin или STDIN , обычно поступает с клавиатуры, ввод осуществляется пользователем, выполняющим команду. Хотя большинство команд могут считывать ввод из файлов, некоторые ожидают, что пользователь введет их с помощью клавиатуры.

    Одним из распространенных способов использования текстовых файлов в качестве стандартного ввода для команд является создание файлов сценариев. Скрипты представляют собой простые текстовые файлы, которые интерпретируются оболочкой при наличии соответствующих разрешений и начинаются с #!/bin/sh в первой строке, что указывает оболочке интерпретировать сценарий как стандартный ввод:

    Simple-Server@localhost:~$ cat examplescriptfile.sh #!/bin/sh echo HelloWorld

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

    Simple-Server@localhost:~$ ./examplescriptfile.sh HelloWorld

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

    Например, следующая команда tr будет принимать данные от пользователя (через клавиатуру), чтобы выполнить преобразование всех символов нижнего регистра в символы верхнего регистра. Выполните следующую команду, введите текст и нажмите Enter, чтобы увидеть перевод:

    Simple-Server@localhost:~$ tr 'a-z' 'A-Z' hello HELLO

    Команда tr не прекращает чтение из стандартного ввода, если только она не завершена. Это можно сделать, нажав комбинацию клавиш Ctrl+D.

    Команда tr не принимает имя файла в качестве аргумента в командной строке. Чтобы выполнить перевод с использованием файла в качестве входных данных, используйте перенаправление ввода. Чтобы использовать перенаправление ввода, введите команду с ее параметрами и аргументами, за которыми следует символ меньше чем < и путь к файлу, который будет использоваться для ввода. Например:

    Simple-Server@localhost:~$ cat Documents/animals.txt 1 retriever 2 badger 3 bat 4 wolf 5 eagle Simple-Server@localhost:~$ tr 'a-z' 'A-Z' < Documents/animals.txt 1 RETRIEVER 2 BADGER 3 BAT 4 WOLF 5 EAGLE

    Конвейеры команд часто используются для эффективного использования команд фильтрации. В командном конвейере выходные данные одной команды отправляются другой команде в качестве входных данных. В Linux и большинстве операционных систем вертикальная черта | используется между двумя командами для представления конвейера команд.

    Например, представьте, что вывод команды history очень велик. Чтобы отправить этот вывод команде less , которая отображает одну страницу данных за раз, можно использовать следующий конвейер команд:

    Simple-Server@localhost:~$ history | less

    Еще лучше пример, взять вывод команды history и отфильтровать вывод с помощью команды grep. В следующем примере текст, выводимый командой history, перенаправляется в команду grep в качестве входных данных. Команда grep сопоставляет строки ls и отправляет вывод на стандартный вывод:

    Simple-Server@localhost:~$ history | grep "ls" 1  ls ~ > /tmp/home.txt 5  ls l> /tmp/ls.txt 6  ls 1> /tmp/ls.txt 7  date 1>> /tmp/ls.txt 8  ls /junk 9  ls /junk > output 10  ls /junk 2> /tmp/ls.err 11  ls /junk 2>> /tmp/ls.err 14  ls > /tmp/ls.all 2>&1 15  ls &> /tmp/ls.all 16  ls /etc/au* >> /tmp/ls.all 2>&1 17  ls /etc/au* &>> /tmp.ls.all 20  history | grep "ls"

    Командные конвейеры становятся действительно мощными, когда объединяются в три или более команд. Например, просмотрите содержимое файла os.csv в каталоге Documents:

    Simple-Server@localhost:~$ cat Documents/os.csv 1970,Unix,Richie 1987,Minix,Tanenbaum 1970,Unix,Thompson 1991,Linux,Torvalds

    Следующая командная строка извлечет некоторые поля из файла os.csv с помощью команды cut , затем отсортирует эти строки с помощью команды sort и, наконец, удалит повторяющиеся строки с помощью команды uniq :

    Simple-Server@localhost:~$ cut -f1 -d',' Documents/os.csv | sort -n | uniq 1970 1987 1991

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

    Команда tee может быть очень полезна для создания журнала команды или сценария. Например, чтобы записать время выполнения процесса, начните с команды date и скопируйте вывод в файл timer.txt:

    Simple-Server@localhost:~$ date | tee timer.txt Mon Jan  1 02:21:24 UTC 2022

    Файл timer.txt теперь содержит копию даты, тот же вывод, что и в предыдущем примере:

    Simple-Server@localhost:~$ cat timer.txt Mon Jan  1 02:21:24 UTC 2022

    Чтобы добавить время в конец файла timer.txt, используйте параметр -a :

    Simple-Server@localhost:~$ date | tee -a timer.txt Mon Jan  1 02:28:43 UTC 2022

    Чтобы запустить несколько команд как одну команду, используйте точку с запятой; символ в качестве разделителя:

    Simple-Server@localhost:~$ date | tee timer.txt; sleep 15; date | tee -a timer.txt Mon Jan  1 02:35:47 UTC 2022 Mon Jan  1 02:36:02 UTC 2022

    Приведенная выше команда отобразит и запишет первый вывод команды date, сделает паузу на 15 секунд, затем отобразит и запишет вывод второй команды date. Файл timer.txt теперь содержит постоянный журнал среды выполнения.

    Опции и параметры команды обычно указываются в командной строке, как аргументы командной строки. В качестве альтернативы мы можем использовать команду xargs для сбора аргументов из другого источника ввода (например, файла или стандартного ввода), а затем передать эти аргументы команде. Команду xargs можно вызывать напрямую, и она примет любой ввод:

    Simple-Server@localhost:~$ xargs Hello There

    Чтобы выйти из команды xargs, нажмите Ctrl+C.

    По умолчанию команда xargs передает ввод команде echo , когда за ней явно не следует другая команда. После нажатия Ctrl+D команда xargs отправит ввод в команду echo:

    Важно знать: Нажатие Ctrl+D после выхода из команды xargs с помощью Ctrl+C приведет к выходу из текущей оболочки. Чтобы отправить ввод команды xargs в команду echo без выхода из оболочки, нажмите Ctrl+D во время выполнения команды xargs.

    Команда xargs наиболее полезна, когда она вызывается в канале. В следующем примере с помощью команды touch будут созданы четыре файла. Файлы будут называться 1a, 1b, 1c и 1d на основе вывода команды echo.

    Simple-Server@localhost:~$ echo '1a 1b 1c 1d' | xargs touch Simple-Server@localhost:~$ ls 1a  1c  Desktop Downloads  Pictures  Templates  timer.txt 1b  1d  Documents  Music  Public Videos

    Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.

    VPS для проекта

    VPS с root-доступом, NVMe и поддержкой 24/7 на Simple-Server.

    StarterVDS

    490

    в месяц

    1 ядро

    1 ГБ RAM

    20 ГБ NVMe

    • 1 IPv4
    • KVM
    • Root-доступ
    • Безлимитный трафик
    Заказать VPS
    Рекомендуем

    PerformanceVDS

    1190

    в месяц

    2 ядра

    4 ГБ RAM

    60 ГБ NVMe

    • 1 IPv4
    • KVM
    • Root-доступ
    • Базовая DDoS-защита
    Заказать VPS

    Нужна другая конфигурация или чистый VPS без панели?

    Все тарифы VPS

    Похожие статьи, которые могут быть вам интересны