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

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

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

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

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

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

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

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

16.1. С помощью команды exec

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

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

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

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

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

Примечания

При использрвании дескриптора с номером 5 могут возникать проблемы. Когда Bash порождает дочерний процесс, например командой exec, то дочерний процесс наследует дескриптор 5 как «открытый» (см. архив почты Чета Рамея (Chet Ramey), SUBJECT: RE: File descriptor 5 is held open) Поэтому, лучше не использовать этот дескриптор.

Источник

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

Здравствуйте форумчане. У меня такой вопрос

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

в скрипт который при запуске

1) выводит и команды и вывод (саму работу скрипта) на экран
2) Записывает и команды из скрипта и вывод в файл

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

Я понимаю, что это решается парой строчек со скобками сверху скрипта и парой строчек снизу. Но какими, я не знаю. Вся надежда на вас.

1. «Вывод работы скрипта, вместе с командами, в файл и на экран» + / –вывод скрипта в файл
Сообщение от redd on 12-Сен-10, 19:42
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

вывод скрипта в файл
2. «Вывод работы скрипта, вместе с командами, в файл и на экран» + / –вывод скрипта в файл
Сообщение от irman (ok) on 12-Сен-10, 19:52

>Как вариант echo использовать.
>
>В винде echo on ))))

Пробовал я это echo + tee. Строка заметно удлиняется и так писать для каждой строки неправильно. Я хочу пару строк сверху, весь скрипт, нетрогая его самого в блок, и пару строк снизу

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. «Вывод работы скрипта, вместе с командами, в файл и на экран» + / –вывод скрипта в файл
Сообщение от Xaionaro (ok) on 12-Сен-10, 20:05

То, что вы просите, очень напоминает действие флага «-x» для sh и bash.

А перенаправить в файл можно с помощью «>». Или я неправильно понял чего вы хотите? 🙂

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

вывод скрипта в файл
5. «Вывод работы скрипта, вместе с командами, в файл и на экран» + / –вывод скрипта в файл
Сообщение от pavlinux (ok) on 13-Сен-10, 01:29

А одновременно можешь, и на экран и в файл?

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

вывод скрипта в файл
6. «Вывод работы скрипта, вместе с командами, в файл и на экран»+1 + / –вывод скрипта в файл
Сообщение от Xaionaro (ok) on 13-Сен-10, 07:45

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

4. «Вывод работы скрипта, вместе с командами, в файл и на экран» + / –вывод скрипта в файл
Сообщение от pavlinux (ok) on 13-Сен-10, 01:28

>[оверквотинг удален]
>1) выводит и команды и вывод (саму работу скрипта) на экран
>2) Записывает и команды из скрипта и вывод в файл
>
>Или другими словами хочу получить возможность видеть работу скрипта вместе с командами
>на экране
>Получить полный лог работы скрипта с командами в файл
>
>Я понимаю, что это решается парой строчек со скобками сверху скрипта и
>парой строчек снизу. Но какими, я не знаю. Вся надежда
>на вас.

У студентов уже начались семинары?! 🙂

+ echo ‘Hello World!’
Hello World!

Во, выше уже написали.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

вывод скрипта в файл
7. «Вывод работы скрипта, вместе с командами, в файл и на экран» + / –вывод скрипта в файл
Сообщение от Xaionaro (ok) on 13-Сен-10, 07:52

Хоть то и offtop, но сейчас обучение работе с sh проводится даже на гуманитарном факультете МИФИ 🙂

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

>Хоть то и offtop, но сейчас обучение работе с sh проводится даже
>на гуманитарном факультете МИФИ 🙂
>
>Хотя с другой стороны, на физических факультетах такого курса нет, что вообще
>странно, т.к. физикам умение работать с unix-подобными системами очень даже нужно,
>в отличие от студентов гуманитарного факультета.

Не, я не студент. Делаю это для большей интеракции в ks.cfg Хочу знать, что он у меня делает при установке, у меня ведь в нем есть и скачивание с сайта и я хочу знать, если скрипт споткнулся, то где. Спасибо, вечером попробую

>Я понимаю, что это решается парой строчек со скобками сверху скрипта и
>парой строчек снизу. Но какими, я не знаю. Вся надежда
>на вас.

Источник

Bash. Запись в файл

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

В этой статье объясняется, как записать текст в файл в Bash, используя операторы перенаправления и команду tee.

Запись в файл с использованием операторов перенаправления

В Bash перенаправление вывода позволяет вам захватить вывод команды и записать его в файл.

Общий формат перенаправления и записи вывода в файл следующий:

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

Вот простой пример, показывающий, как перенаправить вывод echoкоманды в файл:

Чтобы предотвратить перезапись существующих файлов, включите опцию «noclobber» с помощью встроенной команды set:

Оператор >| позволяет переопределить в Bash вариант «noclobber»:

Оператор >> добавить вывод в конец файла, а не перезаписывать файл:

Используйте команду printf для создания сложного вывода:

Если вы хотите записать несколько строк в файл, используйте перенаправление документа Here (Heredoc).

Например, вы можете передать содержимое команде cat и записать его в файл:

Для добавления строк, изменения > с >> перед именем файла:

Вы можете записать вывод любой команды в файл:

Вывод команды date будет записан в файл.

Запись в файл с помощью команды tee

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

Если вы не хотите, чтобы команда tee писал на стандартный вывод, вы можете перенаправить его на /dev/null:

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

Еще одно преимущество teeкоманды состоит в том, что вы можете использовать ее вместе с файлами sudo, принадлежащими другим пользователям, и записывать в них. Чтобы добавить текст в файл, для которого у вас нет прав на запись, добавьте sudo перед tee:

Вывод команды echo передаются в качестве входных данных к tee, который возводит разрешения SUDO и записывает текст в файл.

Заключение

В Linux для записи текста в файл используйте операторы перенаправления > и >> или команду tee.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Источник

Вывод в файл Bash в Linux

Часто возникает необходимость, чтобы скрипт командного интерпретатора Bash выводил результат своей работы. По умолчанию он отображает стандартный поток данных — окно терминала. Это удобно для обработки результатов небольшого объёма или, чтобы сразу увидеть необходимые данные.

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

Стандартные дескрипторы вывода

В системе GNU/Linux каждый объект является файлом. Это правило работает также для процессов ввода/вывода. Каждый файловый объект в системе обозначается дескриптором файла — неотрицательным числом, однозначно определяющим открытые в сеансе файлы. Один процесс может открыть до девяти дескрипторов.

В командном интерпретаторе Bash первые три дескриптора зарезервированы для специального назначения:

ДескрипторСокращениеНазвание
0STDINСтандартный ввод
1STDOUTСтандартный вывод
2STDERRСтандартный вывод ошибок

Их предназначение — обработка ввода/вывода в сценариях. По умолчанию стандартным потоком ввода является клавиатура, а вывода — терминал. Рассмотрим подробно последний.

Вывод в файл Bash

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

Для того, чтобы перенаправить поток вывода с терминала в файл, используется знак «больше» (>).

#!/bin/bash
echo «Строка 1»
echo «Промежуточная строка» > file
echo «Строка 2» > file

Как результат, «Строка 1» выводится в терминале, а в файл file записывается только «Строка 2»:

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

Связано это с тем, что > перезаписывает файл новыми данными. Для того, чтобы дописать информацию в конец файла, используется два знака «больше» (>>).

#!/bin/bash
echo «Строка 1»
echo «Промежуточная строка» > file
echo «Строка 2» >> file

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

Здесь «Промежуточная строка» перезаписала предыдущее содержание file, а «Строка 2» дописалась в его конец.

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

#!/bin/bash
ls badfile > file2
echo «Строка 2» >> file2

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

В данном случае ошибка была в том, что команда ls не смогла найти файл badfile, о чём Bash и сообщил. Но вывелось сообщение в терминал, а не записалось в файл. Всё потому, что использование перенаправления потоков указывает интерпретатору отделять мух от котлет ошибки от основной информации.

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

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

В командном интерпретаторе для обработки сообщений об ошибках предназначен дескриптор STDERR, который работает с ошибками, сформированными как от работы интерпретатора, так и самим скриптом.

По умолчанию STDERR указывает в то же место, что и STDOUT, хотя для них и предназначены разные дескрипторы. Но, как было показано в примере, использование перенаправления заставляет Bash разделить эти потоки.

Чтобы выполнить перенаправление вывода в файл Linux для ошибок, следует перед знаком«больше» указать дескриптор 2.

#!/bin/bash
ls badfile 2> errors
echo «Строка 1» > file3
echo «Строка 2» >> file3

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

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

Пример того, как одна команда возвращает и положительный результат, и ошибку:

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

Команда ls попыталась показать наличие файлов test и badtest. Первый присутствовал в текущем каталоге, а второй — нет. Но сообщение об ошибке было записано в отдельный файл.

Если возникает необходимость выполнить вывод команды в файл Linux, включая её стандартный поток вывода и ошибки, стоит использовать два символа перенаправления, перед которыми стоит указывать необходимый дескриптор.

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

Результат успешного выполнения записан в файл output, а сообщение об ошибке — в errors.

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

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

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

Временные перенаправления в скриптах

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

#!/bin/bash
echo «Это сообщение об ошибке» >&2
echo «Это нормальное сообщение»

При выполнении программы обычно нельзя будет обнаружить отличия:

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

Вспомним, что GNU/Linux по умолчанию направляет вывод STDERR в STDOUT. Но если при выполнении скрипта будет перенаправлен поток ошибок, то Bash, как и полагается, разделит вывод.

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

Этот метод хорошо подходит для создания собственных сообщений об ошибках в сценариях.

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

Если в сценарии необходимо перенаправить вывод в файл Linux для большого объёма данных, то указание способа вывода в каждой инструкции echo будет неудобным и трудоёмким занятием. Вместо этого можно указать, что в ходе выполнения данного скрипта должно осуществляться перенаправление конкретного дескриптора с помощью команды exec:

#!/bin/bash
exec 1> testout
echo «Это тест перенаправления всего вывода»
echo «из скрипта в другой файл»
echo «без использования временного перенаправления»

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

Вызов команды exec запускает новый командный интерпретатор и перенаправляет стандартный вывод в файл testout.

Также существует возможность перенаправлять вывод (в том числе и ошибок) в произвольном участке сценария:

#!/bin/bash
exec 2> testerror
echo «Это начально скрипта»
echo «И это первые две строки»
exec 1> testout
echo «Вывод сценария перенаправлен»
echo «из с терминала в другой файл»
echo «но эта строка записана в файл ошибок» >&2

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

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

Выводы

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

Использование временного и постоянного перенаправлений в сценариях позволяет создавать собственные сообщения об ошибках для записи в отличное от STDOUT место.

Источник

Bash-скрипты, часть 4: ввод и вывод

В прошлый раз, в третьей части этой серии материалов по bash-скриптам, мы говорили о параметрах командной строки и ключах. Наша сегодняшняя тема — ввод, вывод, и всё, что с этим связано.

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

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

Вы уже знакомы с двумя методами работы с тем, что выводят сценарии командной строки:

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

Всё в Linux — это файлы, в том числе — ввод и вывод. Операционная система идентифицирует файлы с использованием дескрипторов.

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

STDIN

STDOUT

Итак, у нас есть некий файл с данными, к которому мы можем добавить другие данные с помощью этой команды:

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

После выполнения этой команды мы увидим сообщения об ошибках на экране.

Попытка обращения к несуществующему файлу

При попытке обращения к несуществующему файлу генерируется ошибка, но оболочка не перенаправила сообщения об ошибках в файл, выведя их на экран. Но мы-то хотели, чтобы сообщения об ошибках попали в файл. Что делать? Ответ прост — воспользоваться третьим стандартным дескриптором.

STDERR

Итак, предположим, что надо перенаправить сообщения об ошибках, скажем, в лог-файл, или куда-нибудь ещё, вместо того, чтобы выводить их на экран.

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

Как вы уже знаете, дескриптор файла STDERR — 2. Мы можем перенаправить ошибки, разместив этот дескриптор перед командой перенаправления:

Перенаправление сообщения об ошибке в файл

▍Перенаправление потоков ошибок и вывода

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

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

Перенаправление STDERR и STDOUT в один и тот же файл

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

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

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

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

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

Как видно, теперь обычный вывод делается в консоль, а сообщения об ошибках попадают в файл.

Сообщения об ошибках записываются в файл

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

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

Перенаправление всего вывода в файл

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

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

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

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

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

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

Вот что появится на экране после запуска скрипта.

Некоторые администраторы Linux используют этот подход для чтения и последующей обработки лог-файлов.

Создание собственного перенаправления вывода

Перенаправляя ввод и вывод в сценариях, вы не ограничены тремя стандартными дескрипторами файлов. Как уже говорилось, можно иметь до девяти открытых дескрипторов. Остальные шесть, с номерами от 3 до 8, можно использовать для перенаправления ввода или вывода. Любой из них можно назначить файлу и использовать в коде скрипта.

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

Перенаправление вывода, используя собственный дескриптор

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

Перенаправить ввод в скрипте можно точно так же, как и вывод. Сохраните STDIN в другом дескрипторе, прежде чем перенаправлять ввод данных.

После окончания чтения файла можно восстановить STDIN и пользоваться им как обычно:

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

После исполнения скрипта мы получим сообщение об ошибке.

Попытка обращения к закрытому дескриптору файла

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

Будьте внимательны, закрывая дескрипторы файлов в сценариях. Если вы отправляли данные в файл, потом закрыли дескриптор, потом — открыли снова, оболочка заменит существующий файл новым. То есть всё то, что было записано в этот файл ранее, будет утеряно.

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

У этой команды есть множество ключей, рассмотрим самые важные.

Вывод сведений об открытых дескрипторах

Посмотрим на вызов команды lsof из скрипта, в котором открыты, в дополнение к стандартным, другие дескрипторы:

Вот что получится, если этот скрипт запустить.

Просмотр дескрипторов файлов, открытых скриптом

Скрипт открыл два дескриптора для вывода ( 3 и 6 ) и один — для ввода ( 7 ). Тут же показаны и пути к файлам, использованных для настройки дескрипторов.

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

Вот, например, как подавить вывод сообщений об ошибках:

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

Итоги

Сегодня вы узнали о том, как в сценариях командной строки работают ввод и вывод. Теперь вы умеете обращаться с дескрипторами файлов, создавать, просматривать и закрывать их, знаете о перенаправлении потоков ввода, вывода и ошибок. Всё это очень важно в деле разработки bash-скриптов.

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

Уважаемые читатели! В этом материале даны основы работы с потоками ввода, вывода и ошибок. Уверены, среди вас есть профессионалы, которые могут рассказать обо всём этом то, что приходит лишь с опытом. Если так — передаём слово вам.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *