Как перенаправить вывод в файл си

Обновлено: 06.07.2024

Оригинал: Linux Fundamentals
Автор: Paul Cobbaut
Дата публикации: 16 октября 2014 г.
Перевод: А.Панин
Дата перевода: 15 декабря 2014 г.

Глава 16. Перенаправление потоков ввода/вывода

Одной из мощных возможностей командной оболочки системы Unix является механизм перенаправления потоков ввода/вывода с возможностью задействования программных каналов .

В данной главе даются пояснения относительно перенаправления стандартных потоков ввода, вывода и ошибок.

Потоки данных stdin, stdout и stderr

Приведенная ниже иллюстрация является графической интерпретацией этих трех потоков данных.

Клавиатура обычно служит источником данных для стандартного потока ввода stdin , в то время, как стандартные потоки вывода stdout и ошибок stderr используются для вывода данных. Новых пользователей Linux может смущать подобное разделение, так как не существует очевидного способа дифференцирования стандартных потоков вывода stdout и ошибок stderr . Опытные же пользователи знают о том, что разделение стандартных потоков вывода и ошибок может оказаться весьма полезным.

Потоки данных stdin, stdout и stderr

В следующем разделе будет рассказано о том, как осуществляется перенаправление упомянутых потоков данных.

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

Операция перенаправления потока данных stdout (>)

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

stdout

Нотация > фактически является аббревиатурой для 1> (в данном случае стандартный поток вывода обозначается как поток номер 1 ). Обратите внимание на то, что командная оболочка bash фактически удаляет описание операции перенаправления потока данных из строки команды перед исполнением этой команды, представленной аргументом 0. Это значит, что в случае исполнения данной команды:

командная оболочка будет рассматривать только два аргумента (echo = аргумент 0, привет = аргумент 1). Описание операции перенаправления потока данных удаляется перед началом подсчета количества аргументов.

Содержимое выходного файла удаляется

В том случае, если в процессе разбора строки команды командная оболочка обнаружит символ знака >, содержимое указанного после него файла будет удалено ! Ввиду того, что описанная процедура выполняется перед извлечением аргумента 0 , содержимое файла будет удалено даже в случае неудачного исполнения команды!

Параметр командной оболочки noclobber

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

Нейтрализация влияния параметра командной оболочки noclobber

Влияние параметра командной оболочки noclobber может быть нейтрализовано с помощью оператора >| .

Оператор дополнения >>

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

Перенаправление стандартного потока ошибок

Операция перенаправления потока данных stderr (2>)

stderr

В примере ниже показана методика перенаправления данных из стандартного потока вывода в файл, а данных из стандартного потока ошибок - в специальный файл устройства /dev/null . Запись 1> идентична записи > .

Операция перенаправления нескольких потоков данных 2>&1

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

Перенаправление стандартного потока вывода и программные каналы

По умолчанию вы не можете использовать утилиту grep для обработки данных стандартного потока ошибок stderr приложения при использовании программных каналов в рамках строки команды, так как данная утилита получает данные исключительно из стандартного потока вывода stdout приложения. Вы не можете одновременно использовать конструкции 1>&2 и 2>&1 для осуществления обмена файловых дескрипторов между стандартным потоком вывода stdout и стандартным потоком ошибок stderr . Вам потребуется третий поток данных для осуществления обмена файловых дескрипторов между стандартным потоком вывода stdout и стандартным потоком ошибок stderr перед символом для создания программного канала.

Объединение стандартных потоков вывода stdout и ошибок stderr

Конструкция &> позволяет объединить стандартные потоки вывода stdout и ошибок stderr в рамках одного потока данных (причем данные будут сохраняться в файле).

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

Операция перенаправления потока данных stdin (<)

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

Структура < here document

Структура here document (иногда называемая структурой here-is-document) является механизмом для ввода данных до момента обнаружения определенной последовательности символов (обычно EOF). Маркер EOF может быть либо введен вручную, либо вставлен автоматически при нажатии комбинации клавиш Ctrl-D.

Структура < here string

Структура here string может использоваться для непосредственной передачи строк команде. При использовании данной структуры достигается такой же эффект, как и при использовании команды echo строка | команда (но вы сможете избежать создания одного дополнительного процесса).

Для получения дополнительной информации об алгоритме base64 следует обратиться к стандарту rfc 3548.

Неоднозначное перенаправление потоков ввода/вывода

Командная оболочка будет осуществлять разбор всей строки команды перед осуществлением перенаправления потоков ввода/вывода. Следующая команда является хорошо читаемой и корректной: Но следующая команды также является корректной, хотя и хуже читается: Даже следующая команда будет прекрасно интерпретироваться командной оболочкой:

Быстрая очистка содержимого файла

Так какой же самый быстрый способ очистки содержимого файла? А какой самый быстрый способ очистки содержимого файла в случае активации параметра командной оболочки noclobber ?

Практическое задание: перенаправление потоков ввода/вывода

1. Активируйте параметр командной оболочки noclobber .

2. Проверьте, активирован ли параметр noclobber , повторив вызов команды вывода содержимого директории ls для директории /etc с перенаправлением данных из стандартного потока вывода в файл.

3. Какой из символов представляет параметр noclobber в списке всех параметров командной оболочки.

4. Деактивируйте параметр noclobber .

5. Убедитесь в том, что вы имеете доступ к двум командным оболочкам, открытым на одном компьютере. Создайте пустой файл tailing.txt . После этого выполните команду tail -f tailing.txt . Используйте вторую командную оболочку для добавления строки текста в этот файл. Убедитесь в том, что эта строка была выведена в первой командной оболочке.

6. Создайте файл, содержащий имена пяти людей. Используйте команду cat и механизм перенаправления потоков ввода/вывода для создания файла, а также структуру here document для завершения ввода.

Корректная процедура выполнения практического задания: перенаправление потоков ввода/вывода

1. Активируйте параметр командной оболочки noclobber .

2. Проверьте, активирован ли параметр noclobber , повторив вызов команды вывода содержимого директории ls для директории /etc с перенаправлением данных из стандартного потока вывода в файл.

3. Какой из символов представляет параметр noclobber в списке всех параметров командной оболочки.

4. Деактивируйте параметр noclobber .

5. Убедитесь в том, что вы имеете доступ к двум командным оболочкам, открытым на одном компьютере. Создайте пустой файл tailing.txt . После этого выполните команду tail -f tailing.txt . Используйте вторую командную оболочку для добавления строки текста в этот файл. Убедитесь в том, что эта строка была выведена в первой командной оболочке.

6. Создайте файл, содержащий имена пяти людей. Используйте команду cat и механизм перенаправления потоков ввода/вывода для создания файла, а также структуру here document для завершения ввода.

С каждым открытым файлом связан дескриптор файла. [1] Дескрипторы файлов stdin, stdout и stderr -- 0, 1 и 2, соответственно. При открытии дополнительных файлов, дескрипторы с 3 по 9 остаются незанятыми. Иногда дополнительные дескрипторы могут сослужить неплохую службу, временно сохраняя в себе ссылку на stdin, stdout или stderr. [2] Это упрощает возврат дескрипторов в нормальное состояние после сложных манипуляций с перенаправлением и перестановками (см. Пример 16-1).

Операции перенаправления и/или конвейеры могут комбинироваться в одной командной строке.

Допускается перенаправление нескольких потоков в один файл.

Закрытие дескрипторов файлов

Закрыть дескриптор входного файла n.

Закрыть дескриптор выходного файла n.

Дочерние процессы наследуют дескрипторы открытых файлов. По этой причине и работают конвейеры. Чтобы предотвратить наследование дескрипторов -- закройте их перед запуском дочернего процесса.

Дополнительные сведения о перенаправлении ввода/вывода вы найдете в Приложение D.

Команда exec <filename перенаправляет ввод со stdin на файл. С этого момента весь ввод, вместо stdin (обычно это клавиатура), будет производиться из этого файла. Это дает возможность читать содержимое файла, строку за строкой, и анализировать каждую введенную строку с помощью sed и/или awk.

Пример 16-1. Перенаправление stdin с помощью exec

Аналогично, конструкция exec >filename перенаправляет вывод на stdout в заданный файл. После этого, весь вывод от команд, который обычно направляется на stdout, теперь выводится в этот файл.

Пример 16-2. Перенаправление stdout с помощью exec

Пример 16-3. Одновременное перенаправление устройств, stdin и stdout, с помощью команды exec

Примечания

дескриптор файла -- это просто число, по которому система идентифицирует открытые файлы. Рассматривайте его как упрощенную версию указателя на файл.


Эмулятор терминала общается с пользователем только по двум каналам:

  • Ввод данных с помощью клавиатуры (буфера обмена)
  • Вывод текстовых (и псевдографических) данных на экран терминала

Если специальных действий не было предпринято, тогда

  • Поток событий с клавиатуры передаётся на стандартный поток ввода
  • Содержимое потоков stdout и stderr выводится на экран в истории

С точки зрения пользователя потоки stdout и stderr выводятся общим текстовым потоком

Если данные с потоков приходят одновременно, то возможно их пересечение

Приложение ls не использует стандартный поток ввода, данные ему передаются исключительно через аргументы

  • stdout используется для вывода списка файлов
  • stderr используется для вывода информации об ошибках

Пример вывода на стандартный поток вывода:

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

Без применения специальных действий различить два вывода мы не сможем

Результат работы команды будет записан в файл output_log.txt

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

В результате запуска пользователю не будет выведено никакой информации, а она будет записана в файл /tmp/ls-output.txt

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

Поток вывода можно перенаправлять и для встроенных команд Bash

В результате будет создан файл text.txt с содержимым 'Hello, world!'

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

  1. Bash получает команду на перенаправление потока с символом >
  2. Bash открывает указанный файл на запись с флагом w , запись с начала
    • Bash должен иметь возможность открыть файл
    • Всё предыдущее содержимое файла будет удалено
  3. Открытый файловый дескриптор устанавливается значением для дескриптора 1, стандартного потока вывода
  4. Происходит запуск нового процесса в изменённом окружении

Создание пустых файлов

Помимо touch можно воспользоваться перенаправлением вывода для создания пустых файлов

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

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

Стандартный поток вывода будет перенаправлен в файл output_log.txt . Если файла не существовало, тогда он будет создан

Пример с использованием ls

В результате выполнения этой последовательности в файле ls-output.txt будет находиться два вывода результата запуска команды ls -l /usr/bin

Просмотр потока stderr

Хотя stdout был перенаправлен, но приложение всё-равно вывело информацию пользователю

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

В результате будет создан файл error-info.txt , содержащий информацию из потока stderr запущенной команды

Все данные из потока stdout будут показаны пользователю

Форма записи 2>&1 говорит, что поток №2 надо связать с потоком №1

Порядок указаний на перенаправления важен

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

Добавление в конец файла

В результате запуска весь вывод будет добавлен в конец файла output.txt

Избавляемся от ошибок

Бывает так, что приложение посылает много информации на поток stderr и мы хотим его игнорировать. Для этих целей можно воспользоваться специальным файлом /dev/null :

Все данные, которые записываются в файл /dev/null , пропадают. Это могут использовать любые приложения

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

Самое простое применение — чтение текстовых файлов

Приложение-повторятель

Если не cat не указать файлы, то оно берёт информацию со стандартного потока ввода

Простейший текстовый редактор

Для завершения работы приложения надо послать сигнал завершения потока Ctrl+D

Для перенаправления потока ввода у процесса надо использовать следующий синтаксис:

В результате поток ввода будет команды будет получать данные из файла input.txt

Вместе с cat его можно использовать для чтения файла:

Перенаправление для тестирования программ

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

В этом случае вам не придётся повторять ввод данных множество раз

Помимо соединения потоков ввода и вывода с файлами Bash (операционная система) позволяет соединять поток вывода одного процесса с потоком ввода другого процесса

Данный механизм называется pipe , конвеер

В Bash для связи потоков двух процессов используется оператор | :

В результате будут запущены КОМАНДА-1 и КОМАНДА-2 , причём стандартный вывод КОМАНДА-1 будет подключён ко входу в конвеер, а выход конвеера подключён к стандартному входу программы КОМАНДА-2

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

  • Прокручивать экран наверх с помощью мыши
  • Использовать горячие клавиши (зависит от эмулятора терминала)
    • Ctrl + Page Up , Ctrl + Page Down
    • Shift + Page Up , Shift + Page Down

    Использование пейджера

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

    Чтобы найти нужную информацию в потоке данных их можно передать less

    Для удобной обработки текстовой информации, приходящей от приложений в UNIX можно использовать приложения, нацеленные на обработку потока строк, приходящих на стандартный поток ввода

    Благодаря конвеерам эти приложения зачастую объединяются

    Приложение сортирует входящий поток строк

    Рассмотрим текстовый файл data.txt :

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

    Отброс с сортировкой:

    Отброс без сортировки:

    Приложение wc предназначено для вычисления статистических харакретистик в файле или потоке данных:

    • Количество слов
    • Количество линий
    • Количество байт
    • Количество символов

    Для поиска уникально названных исполняемых файлов из каталогов /bin и /usr/bin можно воспользоваться командой

    • Если grep находит строку, соответствующую шаблону, то он её выводит
    • Если grep не передать файлы для обработки, то он будет обрабатывать данные из стандартного потока ввода
    • Для описания шаблона используются регулярные выражения

    Отображение начала файла или потока, head

    Приложение head показывает первые строки файла или стандартного потока ввода

    Для управления количеством показываемых линий используется аргумент -n

    Отображение конца файла или потока, tail

    Приложение tail показывает последние строки файла или стандартного потока ввода

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

    Приложение tail позволяет следить за изменениями в файле

    В одной консоли будем следить за состоянием файла:

    В другой консоли будем изменять данный файл:

    Термином tee называется Т-образный отвод трубопровода

    Приложение tee принимает данные на стандартный поток ввода, а затем записывает их на стандартный поток вывода и в файл на жёстком диске

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

    AWK — это инструмент и скриптовый язык, предназначенный для работы с текстовыми документами

    • AWK работает над отдельными строками документа
    • AWK разбивает строки на поля
    • AWK может сопоставлять строки с шаблонами
    • AWK может выполнять действия над подходящими линиями

    Данный текстовый редактор позволяет выполнять операции над отдельными строками в файле или в потоке данных

    Ввод/вывод в операционных системах (как MS-DOS, так и UNIX) может быть организован двумя принципиально разными способами. Первый способ - это прямое программирование устройств ввода/вывода (дисковода, экрана, модема, клавиатуры). Он может быть организован на различных уровнях (непосредственное программирование устройств, использование сервисных средств операционной системы, смешанный подход и т.д.), но суть его при этом не меняется. Каждая программа, написанная с использованием этого способа, может работать только с этим устройством и ни с каким другим. В настоящее время используется именно этот способ. Именно с помощью этого подхода (точнее, путем "косвенного" программирования периферийных устройств через драйверы этих устройств) и реализован классический WIMP - интерфейс, о котором уже было много сказано в предыдущей главе. Он позволяет создавать красивые и довольно содержательные средства общения с пользователем (меню, окна и тому подобное), а современные технологии позволяют программе при установке автоматически настраиваться на установленное на компьютере оборудование. Но у этих систем есть недостаток: они не могут принять данные с устройств и передать данные устройствам, для работы с которыми они не созданы. Например, нельзя данные вводить с модема, если программа работает только с клавиатурой. Чтобы осуществить это, используют другой способ: ввод/вывод с использованием потоков. В этом случае каждое устройство рассматривается операционной системой как файл, куда можно поместить и откуда можно взять информацию. Так же, как информация, записанная в файл, рассматривается операционной системой как единое целое, не зависимо от способа записи его на диске, так и физическая реализация процесса ввода/вывода информации устройством никак не отражается на работе пользователя.

    C.5.2. Ограничение потоков.

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

    C.5.3. Определение и классификация потоков.

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

    1. Стандартный поток ввода - это обычно клавиатура.

    2. Стандартный поток вывода - это обычно монитор.

    C.5.4. Переназначение потоков.

    Использование потоков не имело бы никаких преимуществ перед прямым программированием устройств, если бы их нельзя было переназначать с одного устройства на другое , а также переназначить ввод/вывод информации устройством в файл . Для этого используются следующие конструкции (в DOS и UNIX).

    C.5.5. Переназначение стандартного потока ошибок (в UNIX).

    C.5.6. Перенаправление потока ввода.

    Переадресация стандартного ввода осуществляется конструкцией < для DOS и UNIX и 0> только для UNIX.

    Пример использования переадресации (ввод данных программой по умолчанию производится с клавиатуры, и обработанная ею информация выводится на экран):

    program < indata.dat >> outdata.txt

    В данном примере входные данные программы program читаются из файла indata.dat и записываются в файл outdata.txt.

    sort < mylist > prn

    данные из файла mylist сортируются стандартной программой MS-DOS sort и результат выводится на принтер.

    C.5.7. Конвейерная обработка.

    Символы переадресации очень удобны, но иногда бывает необходимо организовать последовательность программ, выполняющих обработку информации, причем результат редыдущей программы является исходным для следующей . При этом промежуточные данные желательно никуда не записывать. Чтобы организовать такую обработку, используют знак '|' конвейера . Команды-"цепочки" такой обработки данных просто записываются в одну строку в порядке их вызова для обработки данных, и отделяются одна от другой знаком конвейера '|'. Пример:

    sort < mylist | more.

    В этом примере данные из файла mylist сортируются программой sort и постранично выводятся на экран программой more.

    В UNIX тоже возможна переадресация потока с одновременным выводом данных на экран, и даже переадресация на два разных устройства. Для переадресации стандартного вывода в файл с одновременной выдачей информации на экран используется команда tee. Например, команда cat в UNIX позволяет просматривать файл. Следующая конструкция:

    cat first | tee second

    копирует файл first в файл second, одновременно показывая его на экране.

    C.5.8. Перенаправление вывода на принтер.

    Для вывода данных на принтер используются конструкции:

    в DOS > prn в UNIX lpr

    Еще один пример: команда

    cat first | tee second | lpr

    копирует файл first в файл second, одновременно распечатывая его на принтере.

    Командой lpr можно также вывести несколько файлов на печать. Подробности смотри ниже.

    C.5.9. История возникновения потоков в MS-DOS.

    Исторически первая версия MS-DOS основывалась на многоплатформенной операционной системе для восьмиразрядных процессоров - CP/M. От нее она унаследовала и способ работы с файлами - через контрольные блоки файлов (File Control Block, FCB). Но уже во второй версии MS-DOS стала использоваться позаимствованная из операционной системы UNIX работа с файлами через дескрипторы файлов (File Handle). Одновременно с реализацией метода дескрипторов файла в MS-DOS из UNIX перешел поточный механизм организации файлов и возможность перенаправления потоков. с тех пор работа с файлами через FCB стала анахронизмом и поддерживается в операционных системах фирмы Microsoft (вплоть до Windows 98) лишь для совместимости со старыми версиями.

    Следует также отметить, что термины "FCB", "дескрипторы файлов", "потоки" употребляются применительно к интерфейсу операций ввода/вывода операционных систем, а не для файловых систем как таковых. Так, использование для работы с файлами метода дескрипторов может происходить и в операционной системе MS-DOS с файловой системой FAT, и в Windows 2000 с NTFS, и в Novell NetWare с NWFS, и в Linux с NFS!

    C.5.10. Резюме.

    Итак, в этом разделе Вы кратко познакомились с понятием потока, дескриптора файла в интерфейсе ввода/вывода операционных систем, а также научились перенаправлять потоки операционных систем. Понятие потока тесно связано с понятиями "буфер ввода/вывода" и "кэширования диска". Об этих понятиях уже говорилось во втором выпуске данной серии. В этой части объяснилось назначение этих элементов. Также Вы познакомились с понятием "конвейер" и правилами его использования.

    Напоследок приводим таблицы, в которой кратко приводятся данные, описанные в этом разделе.

    Всё в Linux — это файлы, в том числе — ввод и вывод. Операционная система идентифицирует файлы с использованием дескрипторов. Каждому процессу позволено иметь до девяти открытых дескрипторов файлов. Оболочка bash резервирует первые три дескриптора с идентификаторами 0, 1 и 2. Вот что они означают.

    • 0, STDIN — стандартный поток ввода
    • 1, STDOUT — стандартный поток вывода
    • 2, STDERR — стандартный поток ошибок

    STDIN

    STDIN — это стандартный поток ввода оболочки. Для терминала стандартный ввод — это клавиатура. Когда используется символ перенаправления ввода — < , Linux заменяет дескриптор файла стандартного ввода на тот, который указан в команде. Система читает файл и обрабатывает данные так, будто они введены с клавиатуры.

    Многие команды bash принимают ввод из STDIN , если в командной строке не указан файл, из которого надо брать данные. Например, это справедливо для команды cat .

    Когда вы вводите команду cat в командной строке, не задавая параметров, она принимает ввод из STDIN . После того, как вы вводите очередную строку, cat просто выводит её на экран. И останавливается после того как получает EOF . EOF вводится нажатием сочетания клавиш Ctrl+D.

    STDOUT

    Можно осуществить перенаправление вывода в файл с добавлением в конец с помощью >> . При этом информация, хранящаяся в файле не будет удалена, а вся новая информация будет добавлена в конец этого файла.

    STDERR

    Устаревшая форма записи:

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

    В этом случае сначала вывод ошибок перенаправляется в стандартный вывод (на экран), а потом стандартный вывод перенаправляется в файл data-error.txt . То есть, ошибки будут выведены в консоль, а данные — в файл.

    Для дозаписи в файл data-error.txt

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

    Существует два метода перенаправления вывода в сценариях командной строки:

    • Временное перенаправление, или перенаправление вывода одной строки
    • Постоянное перенаправление, или перенаправление всего вывода сценария

    Временное перенаправление вывода

    Если запустить этот скрипт, обе строки попадут на экран, так как, как вы уже знаете, по умолчанию ошибки выводятся туда же, куда и обычные данные.

    Запустим скрипт так, чтобы вывод STDERR попадал в файл:

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

    Если в скрипте нужно перенаправлять много выводимых на экран данных, добавлять >&2 к каждому вызову echo неудобно. Вместо этого можно задать перенаправление вывода в определённый дескриптор на время выполнения скрипта, воспользовавшись командой exec :

    После запуска сценария весь вывод будет перенаправлен в файл output.txt .

    Команду exec можно использовать не только в начале скрипта, но и в других местах:

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

    Для перенаправления ввода можно воспользоваться тем же способом, который использовался для перенаправления вывода. Например, команда exec позволяет сделать источником данных для STDIN какой-нибудь файл:

    Эта команда указывает оболочке на то, что источником вводимых данных должен стать файл data.txt , а не обычный STDIN . Посмотрим на перенаправление ввода в действии:

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

    Тот же подход используется, если, например, надо очистить файл, не удаляя его:

    Читайте также: