вывод скрипта в файл
Глава 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 + tee. Строка заметно удлиняется и так писать для каждой строки неправильно. Я хочу пару строк сверху, весь скрипт, нетрогая его самого в блок, и пару строк снизу | ||
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору |
3. «Вывод работы скрипта, вместе с командами, в файл и на экран» | + / – | |
Сообщение от Xaionaro (ok) on 12-Сен-10, 20:05 | ||
А перенаправить в файл можно с помощью «>». Или я неправильно понял чего вы хотите? 🙂 | ||
Ответить | Правка | ^ к родителю #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 | ||
У студентов уже начались семинары?! 🙂 + echo ‘Hello World!’ Во, выше уже написали. | ||
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору |
7. «Вывод работы скрипта, вместе с командами, в файл и на экран» | + / – | |||||||||||||
Сообщение от Xaionaro (ok) on 13-Сен-10, 07:52 | ||||||||||||||
Хотя с другой стороны, на физических факультетах такого курса нет, что вообще странно, т.к. физикам умение работать с 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 первые три дескриптора зарезервированы для специального назначения:
Их предназначение — обработка ввода/вывода в сценариях. По умолчанию стандартным потоком ввода является клавиатура, а вывода — терминал. Рассмотрим подробно последний. Вывод в файл Bash1. Перенаправление стандартного потока выводаДля того, чтобы перенаправить поток вывода с терминала в файл, используется знак «больше» (>). #!/bin/bash Как результат, «Строка 1» выводится в терминале, а в файл file записывается только «Строка 2»: Связано это с тем, что > перезаписывает файл новыми данными. Для того, чтобы дописать информацию в конец файла, используется два знака «больше» (>>). #!/bin/bash Здесь «Промежуточная строка» перезаписала предыдущее содержание file, а «Строка 2» дописалась в его конец. Если во время использования перенаправления вывода интерпретатор обнаружит ошибку, то он не запишет сообщение о ней в файл. #!/bin/bash В данном случае ошибка была в том, что команда ls не смогла найти файл badfile, о чём Bash и сообщил. Но вывелось сообщение в терминал, а не записалось в файл. Всё потому, что использование перенаправления потоков указывает интерпретатору отделять мух от котлет ошибки от основной информации. Это особенно полезно при выполнении сценариев в фоновом режиме, где приходится предусматривать вывод сообщений в журнал. Но так как ошибки в него писаться не будут, нужно отдельно перенаправлять поток ошибок для того, чтобы выполнить их вывод в файл Linux. 2. Перенаправление потока ошибокВ командном интерпретаторе для обработки сообщений об ошибках предназначен дескриптор STDERR, который работает с ошибками, сформированными как от работы интерпретатора, так и самим скриптом. По умолчанию STDERR указывает в то же место, что и STDOUT, хотя для них и предназначены разные дескрипторы. Но, как было показано в примере, использование перенаправления заставляет Bash разделить эти потоки. Чтобы выполнить перенаправление вывода в файл Linux для ошибок, следует перед знаком«больше» указать дескриптор 2. #!/bin/bash В результате работы скрипта создан файл errors, в который записана ошибка выполнения команды ls, а в file3 записаны предназначенные строки. Таким образом, выполнение сценария не сопровождается выводом информации в терминал. Пример того, как одна команда возвращает и положительный результат, и ошибку: Команда ls попыталась показать наличие файлов test и badtest. Первый присутствовал в текущем каталоге, а второй — нет. Но сообщение об ошибке было записано в отдельный файл. Если возникает необходимость выполнить вывод команды в файл Linux, включая её стандартный поток вывода и ошибки, стоит использовать два символа перенаправления, перед которыми стоит указывать необходимый дескриптор. Результат успешного выполнения записан в файл output, а сообщение об ошибке — в errors. По желанию можно выводить и ошибки, и обычные данные в один файл, используя &>. Обратите внимание, что Bash присваивает сообщениям об ошибке более высокий приоритет по сравнению с данными, поэтому в случае общего перенаправления ошибки всегда будут располагаться в начале. Временные перенаправления в скриптахЕсли есть необходимость в преднамеренном формировании ошибок в сценарии, можно каждую отдельную строку вывода перенаправлять в STDERR. Для этого достаточно воспользоваться символом перенаправления вывода, после которого нужно использовать & и номер дескриптора, чтобы перенаправить вывод в STDERR. #!/bin/bash При выполнении программы обычно нельзя будет обнаружить отличия: Вспомним, что GNU/Linux по умолчанию направляет вывод STDERR в STDOUT. Но если при выполнении скрипта будет перенаправлен поток ошибок, то Bash, как и полагается, разделит вывод. Этот метод хорошо подходит для создания собственных сообщений об ошибках в сценариях. Постоянные перенаправления в скриптахЕсли в сценарии необходимо перенаправить вывод в файл Linux для большого объёма данных, то указание способа вывода в каждой инструкции echo будет неудобным и трудоёмким занятием. Вместо этого можно указать, что в ходе выполнения данного скрипта должно осуществляться перенаправление конкретного дескриптора с помощью команды exec: #!/bin/bash Вызов команды exec запускает новый командный интерпретатор и перенаправляет стандартный вывод в файл testout. Также существует возможность перенаправлять вывод (в том числе и ошибок) в произвольном участке сценария: #!/bin/bash Такой метод часто применяется при необходимости перенаправить лишь часть вывода скрипта в другое место, например в журнал ошибок. ВыводыПеренаправление в скриптах Bash, чтобы выполнить вывод в файл Bash, является хорошим средством ведения различных журналов, особенно в фоновом режиме. Использование временного и постоянного перенаправлений в сценариях позволяет создавать собственные сообщения об ошибках для записи в отличное от STDOUT место. Bash-скрипты, часть 4: ввод и выводВ прошлый раз, в третьей части этой серии материалов по bash-скриптам, мы говорили о параметрах командной строки и ключах. Наша сегодняшняя тема — ввод, вывод, и всё, что с этим связано. Вы уже знакомы с двумя методами работы с тем, что выводят сценарии командной строки: Стандартные дескрипторы файловВсё в Linux — это файлы, в том числе — ввод и вывод. Операционная система идентифицирует файлы с использованием дескрипторов. Каждому процессу позволено иметь до девяти открытых дескрипторов файлов. Оболочка bash резервирует первые три дескриптора с идентификаторами 0, 1 и 2. Вот что они означают. STDINSTDOUTИтак, у нас есть некий файл с данными, к которому мы можем добавить другие данные с помощью этой команды: Перенаправление вывода команды в файл После выполнения этой команды мы увидим сообщения об ошибках на экране. Попытка обращения к несуществующему файлу При попытке обращения к несуществующему файлу генерируется ошибка, но оболочка не перенаправила сообщения об ошибках в файл, выведя их на экран. Но мы-то хотели, чтобы сообщения об ошибках попали в файл. Что делать? Ответ прост — воспользоваться третьим стандартным дескриптором. STDERRИтак, предположим, что надо перенаправить сообщения об ошибках, скажем, в лог-файл, или куда-нибудь ещё, вместо того, чтобы выводить их на экран. ▍Перенаправление потока ошибокКак вы уже знаете, дескриптор файла STDERR — 2. Мы можем перенаправить ошибки, разместив этот дескриптор перед командой перенаправления: Перенаправление сообщения об ошибке в файл ▍Перенаправление потоков ошибок и выводаПри написании сценариев командной строки может возникнуть ситуация, когда нужно организовать и перенаправление сообщений об ошибках, и перенаправление стандартного вывода. Для того, чтобы этого добиться, нужно использовать команды перенаправления для соответствующих дескрипторов с указанием файлов, куда должны попадать ошибки и стандартный вывод: Перенаправление ошибок и стандартного вывода Перенаправление STDERR и STDOUT в один и тот же файл Перенаправление вывода в скриптахСуществует два метода перенаправления вывода в сценариях командной строки: ▍Временное перенаправление выводаЕсли запустить скрипт, обе строки попадут на экран, так как, как вы уже знаете, по умолчанию ошибки выводятся туда же, куда и обычные данные. Запустим скрипт так, чтобы вывод STDERR попадал в файл. Как видно, теперь обычный вывод делается в консоль, а сообщения об ошибках попадают в файл. Сообщения об ошибках записываются в файл ▍Постоянное перенаправление выводаЕсли в скрипте нужно перенаправлять много выводимых на экран данных, добавлять соответствующую команду к каждому вызову echo неудобно. Вместо этого можно задать перенаправление вывода в определённый дескриптор на время выполнения скрипта, воспользовавшись командой exec : Перенаправление всего вывода в файл Команду exec можно использовать не только в начале скрипта, но и в других местах: Вот что получится после запуска скрипта и просмотра файлов, в которые мы перенаправляли вывод. Перенаправление вывода в разные файлы Освоив это, вы сможете перенаправлять вывод туда, куда нужно. Теперь поговорим о перенаправлении ввода. Перенаправление ввода в скриптахДля перенаправления ввода можно воспользоваться той же методикой, которую мы применяли для перенаправления вывода. Например, команда exec позволяет сделать источником данных для STDIN какой-нибудь файл: Вот что появится на экране после запуска скрипта. Некоторые администраторы Linux используют этот подход для чтения и последующей обработки лог-файлов. Создание собственного перенаправления выводаПеренаправляя ввод и вывод в сценариях, вы не ограничены тремя стандартными дескрипторами файлов. Как уже говорилось, можно иметь до девяти открытых дескрипторов. Остальные шесть, с номерами от 3 до 8, можно использовать для перенаправления ввода или вывода. Любой из них можно назначить файлу и использовать в коде скрипта. Назначить дескриптор для вывода данных можно, используя команду exec : Перенаправление вывода, используя собственный дескриптор Создание дескрипторов файлов для ввода данныхПеренаправить ввод в скрипте можно точно так же, как и вывод. Сохраните STDIN в другом дескрипторе, прежде чем перенаправлять ввод данных. После окончания чтения файла можно восстановить STDIN и пользоваться им как обычно: Закрытие дескрипторов файловПосле исполнения скрипта мы получим сообщение об ошибке. Попытка обращения к закрытому дескриптору файла Всё дело в том, что мы попытались обратиться к несуществующему дескриптору. Будьте внимательны, закрывая дескрипторы файлов в сценариях. Если вы отправляли данные в файл, потом закрыли дескриптор, потом — открыли снова, оболочка заменит существующий файл новым. То есть всё то, что было записано в этот файл ранее, будет утеряно. Получение сведений об открытых дескрипторахУ этой команды есть множество ключей, рассмотрим самые важные. Вывод сведений об открытых дескрипторах Посмотрим на вызов команды lsof из скрипта, в котором открыты, в дополнение к стандартным, другие дескрипторы: Вот что получится, если этот скрипт запустить. Просмотр дескрипторов файлов, открытых скриптом Скрипт открыл два дескриптора для вывода ( 3 и 6 ) и один — для ввода ( 7 ). Тут же показаны и пути к файлам, использованных для настройки дескрипторов. Подавление выводаВот, например, как подавить вывод сообщений об ошибках: Тот же подход используется, если, например, надо очистить файл, не удаляя его: ИтогиСегодня вы узнали о том, как в сценариях командной строки работают ввод и вывод. Теперь вы умеете обращаться с дескрипторами файлов, создавать, просматривать и закрывать их, знаете о перенаправлении потоков ввода, вывода и ошибок. Всё это очень важно в деле разработки bash-скриптов. В следующий раз поговорим о сигналах Linux, о том, как обрабатывать их в сценариях, о запуске заданий по расписанию и о фоновых задачах. Уважаемые читатели! В этом материале даны основы работы с потоками ввода, вывода и ошибок. Уверены, среди вас есть профессионалы, которые могут рассказать обо всём этом то, что приходит лишь с опытом. Если так — передаём слово вам.
|