Команда read в линукс

Обновлено: 04.07.2024

Встроенная команда read является противоположностью командам echo и printf. Синтаксис команды read следующий:

Из стандартного входного потока или из дескриптора файла, указываемого в качестве аргумента в параметре -u , считывается одна строка. Первое слово из строки присваивается первому имени NAME1, второе слово — второму имени и так далее, оставшиеся слова и имеющиеся между ними разделители назначаются последнему имени NAMEN. Если слов, считываемых из входного потока меньше, чем имен, оставшимся именам присваиваются пустые значения.

Для разбиения входной строки на слова или лексемы используются символы, хранящиеся в переменной IFS ; смотрите раздел "Разбиение на слова". Для отмены особого свойства следующего символа и для продолжения строки можно использовать символ обратного слеша.

Если имена не указываются, то считанная строка назначается переменной REPLY .

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

Во встроенной команде read поддерживаются следующие параметры:

Таблица 8.2. Параметры встроенной команды read

Слова присваиваются подряд идущим элементам массива ANAME , присваивание начинается с элемента с индексом 0. Перед присваиванием все элементы удаляются из ANAME . Другие аргументы NAME игнорируются

В качестве завершающего элемента входной строки используется символ DELIM , а не символ новой строки.

Для чтения строки используется программа readline.

Команда read возвращает управление после чтения символов NCHARS и не ждет завершения ввода строки.

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

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

Тихий режим. Если входные данные поступают из терминала, на терминал не выдается эхо-ответ.

Если в течение TIMEOUT секунд не будет завершено чтение входной строки, то для команды read возникнет состояние таймаута и будет возвращен код неудачного выполнения команды. Этот параметр не действует, если команда read читает входные данные не из терминала и не из конвейера.

Чтение входных данных из дескиптора файла FD .

Это простой пример представляет собой улучшенный вариант скрипта leaptest.sh из предыдущей главы:

Приглашение пользователю ввести данные

В следующем примере показано, как можно использовать приглашения, объясняющие, что пользователь должен ввести.

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

Теперь другие могут запустить скрипт:

Через некоторое время список friends будет выглядеть следующим образом:

Конечно, эта ситуация не идеальна, поскольку каждый может редактировать (но не удалять) файлы Мишеля. Вы можете решить эту проблему с помощью специальных режимов доступа к файлу скрипта; смотрите описание SUID и SGID в руководстве "Введение в Linux".

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

Общие положения

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

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

Ввод из файла и вывод в файл сопровождается обработкой целых чисел, с помощью которых отслеживаются все файлы, открываемые в данном процессе. Эти числовые значения называются дескрипторами файлов. Самыми известными являются дескрипторы файлов stdin, stdout и stderr, номера дескрипторов файлов для которых равны 0, 1 и 2, соответственно. Под этими номерами зарезервированы соответствующие им устройства. В Bash в качестве дескрипторов файлов можно также использовать порты TCP и UDP сетевых хостов.

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

Обратите внимание, что каждый процесс имеет в /proc/self свое собственное представление, т.к. фактически это символическая ссылка на /proc/<идентификатор процесса> .

Вы можете с помощью info MAKEDEV и info proc посмотреть дополнительную информацию о директории /proc и о том, что в вашей системе в каждом запущенном процессе делается с дескрипторами стандартных файлов.

Когда выполняется конкретная команда, ее выполнение состоит из следующих шагов и происходит в приведенном ниже порядке:

  • Если стандартный вывод предыдущей команды подключен через конвейер к стандартному входу текущей команды, то /proc/<идентификатор текущего процесса>/fd/0 будет заменен на тот же самый анонимный конвейер, который использовался для /proc/<идентификатор предыдущего процесса>/fd/1 .
  • Если стандартный вывод текущей команды подключен через конвейер к стандартному входу следующей команды, /proc/<идентификатор текущего процесса>/fd/1 будет заменен на еще один анонимный конвейер.
  • Перенаправление для текущей команды обрабатываются слева направо
  • Перенаправление "N>&M" или "N<&M", указываемое после команды, представляет собой создание или изменении символической ссылки /proc/self/fd/N , так чтобы она ссылалась туда, куда и /proc/self/fd/M .
  • Перенаправление "N>файл" и "N<файл" представляет собой создание или изменение символической ссылки /proc/self/fd/N , так чтобы она указывала на целевой файл.
  • Если указывается "N>&-", то это вызывает удаление символической ссылки /proc/self/fd/N .
  • Только после этого происходит выполнение текущей команды.

Когда скрипт запускается из командной строки, то ничего меняться не будет, поскольку процесс в дочерней командной оболочке будет использовать те же самые дескрипторы файлов, что и в родительской оболочке. Когда родительская оболочка отсутствует, например, когда вы запускаете скрипт с помощью cron, дескрипторами стандартных файлов будут конвейеры или другие (временные) файлы, если не используется какой-нибудь вариант перенаправления. Это демонстрируется в приведенном ниже примере, в котором показан выход простого скрипта at:

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

Из предыдущих примеров понятно, что вы можете для скрипта указать входной и выходной файлы (подробности смотрите в разделе "Ввод из файла и вывод в файл"), но некоторые могут забыть о перенаправлении ошибок - выход, который может позже потребоваться. К тому же, если повезет, ошибки будут отсылаться вам по почте и, возможно, удастся выявить возможные причины ошибок. Если вы не настолько удачный, ошибки могут привести к отказу в работе скрипта, а обнаружить и отослать ошибку не удастся, из-за чего вы не сможете выполнить какую-либо отладку.

Обратите внимание, что при перенаправлении ошибок важен порядок выполнения действий. Например, следующая команда, которая есть в /var/spool

будет перенаправлять стандартный выходной поток команды ls в файл unaccessible-in-spool , находящийся в /var/tmp . Команда

будет перенаправлять стандартный ввод и стандартный поток ошибок в spoollist . Команда

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

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

Это эквивалентно конструкции > FILE 2>&1, которая использовалась в предыдущих примерах. Кроме того, она объединяется с перенаправлением в /dev/null , например, когда вы просто хотите выполнять команду, независимо от того, будут ошибки или нет.

Ввод из файла и вывод в файл

Использование /dev/fd

В директории /dev/fd находятся записи с именами 0 , 1 , 2 и так далее. Открытие файла /dev/fd/N эквивалентно дублированию дескриптора файла N. Если в вашей системе есть /dev/stdin , /dev/stdout и /dev/stderr , вы сможете увидеть, что они, соответственно, эквивалентны /dev/fd/0 , /dev/fd/1 и /dev/fd/2 .

Файлы директория /dev/fd используются, главным образом, из командной оболочки. Этот механизм позволяет программам, которые используют пути к файлам в качестве аргументов, обрабатывать стандартный вход и стандартный выход точно также, как и пути к другим файлам. Если в системе нет директория /dev/fd , вам потребуется искать способ обойти проблему. Это можно сделать, например, при помощи дефиса (-), указывающего, что программа должна читать из конвейера. Например:

Команда cat сначала читает файл header.txt , затем свой собственный стандартный ввод, который является выходом команды filter, и, затем, файл footer.txt. Во многих программах не учитывается особое свойство дефиса, который, когда он используется в качестве аргумента командной строки, является ссылкой на стандартный ввод или стандартный вывод. Проблемы также могут возникнуть, если дефис используется в качестве первого аргумента, т. к. он может рассматриваться как параметр предыдущей команды. Использование /dev/fd ведет к единообразию и предотвращает путаницу:

В этом примере все выходные данные дополнительно через конвейер направляются в команду lp, которая отправляет их на используемый по умолчанию принтер.

Read и exec

Назначение файлам дескрипторов

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

для назначения дескриптора N выходному файлу file и

для назначения дескриптора N входному файлу file . После назначения файлу дескриптора, дескриптор можно использовать с командами перенаправления так, как это показано в следующем примере:

Использование этого дескриптора файла может быть причиной проблем, смотрите главу 16 в книге "Advanced Bash-Scripting Guide" ("Искусство программирования на языке сценариев командной оболочки"). Мы настоятельно рекомендуем его не использовать.

Команда read в скриптах

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

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

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

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

Ниже приводится простой пример перенаправления в конвейер только стандартного потока ошибок:

Встраиваемые документы (Here documents)

Часто ваш скрипт может вызывать другую программу или скрипт, в которых нужно вводит данные. С помощью встраиваемых документов (here documents) можно указать командной оболочке считывать входные данные из некоторого источника до тех пор, пока в нем не будет найдена строка, содержащая определенную подстроку (ею не могут быть завершающие пробелы). Затем все строки, считанные до этого места, будут использованы в вызванной программе или скрипте в качестве стандартного входного потока.

В результате вам не потребуется вызывать файлы по отдельности; вы можете пользоваться специальными символами командной оболочки и это будет выглядеть гораздо лучше, чем куча команд echo:

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

И о том, как работает скрипт: когда выдается строка "Is this ok [y/N]" ("Это правильно [y/N]"), скрипт автоматически отвечает "y":

Встроенная команда read считывает одну строку данных (текст, пользовательский ввод) из стандартного потока ввода или присоединенного к нему файлового дескриптора в одну или более переменных, которые перечислены как <NAME. > .

Если параметр(ы) <NAME. > дана - строка делится на слова, используя переменную IFS , и каждое слово присваивается как значение переменным в списке параметров <NAME> . Оставшиеся слова присваиваются последнему параметру <NAME> если слов больше чем параметров.

Если команде не было определено парамтров <NAME> вообще, тогда строка полностью считывается(без разделения на слова) и присваивается как значение переменной оболочки REPLY . Тогда REPLY полностью содержит прочитанную строк, лишь с убранными пробелами в начале и в конце.

Опции

Опция Значние
-a <ARRAY> считывает по слову в массив <ARRAY> вместо нормальных переменных.
-d <DELIM> распознает <DELIM> вместо символа <newline> , для обозначения конца строки.
-e для интерактивной оболочки: использует Bash-интерфейс readline для того что бы читать данные
-i <STRING> preloads the input buffer with text from <STRING> , only works when Readline ( -e ) is used
-n <NCHARS> число, считывает <NCHARS> символов ввода и выходит.
-N <NCHARS> число, считывает <NCHARS> cимволов ввода, игнорируя всякие символы окончания строки и выходит.
-p <PROMPT> строка приглашения <PROMPT> . Без оконечного перевода строки, Обычно в ней выводят подсказку, перед тем как команда read будет считывать данные.
-r сырой ввод - отключает интерпретацию , backslash escapes и символов продолжения строки в считываемых данных
-s секретный ввод, не выводит в терминал введенные данные. (для вводов паролей)
-t
таймаут. ожидает данных <TIMEOUT> секунд и потом выходит (с exit code 1). Дробный <TIMEOUT> в секунадах ("5.33") разрешен. Значение 0 - 0 немедленно возвращает и показывает если данные ждут -immediately returns and indicates if data is waiting in the exit code. Timeout означает код возврата больше 128. Если таймаут наступает раньше чем чем все данные будут получены - будет возвращена лишь полученная часть данных.
-u <FD> используется файловый дескриптор <FD> , взамен stdin (0)

Когда заданы оба параметры, -a <ARRAY> и имя переменной <NAME> , тогда read будет наполнять значениями массив, а не переменные.

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

присвоит элементу массива вычитанное значение, используя синтаксис из . Reading into array elements using the syntax above may cause pathname expansion to occur.

Пример: вы находитесь в каталоге с файлом, который имеет имя x1 , и вы хотите прочитать его в массив x , с индексом 1

тогда pathname expansion развернет в имя файла x1 и прервет его работу!

Even worse, if nullglob is set, your array/index will disappear.

Чтобы обойти такое поведение - отключите развертывание пути или экранируйте имя массива и индекс:

Examples

Rudimentary cat replacement

A rudimentary replacement for the cat command: read lines of input from a file and print them on the terminal.

Note: Here, read -r and the default REPLY is used, because we want to have the real literal line, without any mangeling. printf is used, because (depending on settings), echo may interpret some baskslash-escapes or switches (like -n ).

Press any key.

Remember the MSDOS pause command? Here's something similar:

Reading Columns

Simple Split

Read can be used to split a string:

Take care that you cannot use a pipe:

Why? because the commands of the pipe run in subshells that cannot modify the parent shell. As a result, the variables col1 , col2 and col3 of the parent shell are not modified (see article: Bash and the process tree).

If the variable has more fields than there are variables, the last variable get the remaining of the line:

Changing The Separator

By default reads separates the line in fields using spaces or tabs. You can modify this using the special variable IFS, the Internal Field Separator.

Here we use the var=value command syntax to set the environment of read temporarily. We could have set IFS normally, but then we would have to take care to save its value and restore it afterward ( OLD=$IFS IFS=”:”; read . ;IFS=$OLD ).

The default IFS is special in that 2 fields can be separated by one or more spaces. When you set IFS to something else, the fields are separated by exactly one character:

See how the :: in the middle infact defines an additional empty field.

The fields are separated by exactly one character, but the character can be different between each field:

Favorite

Добавить в избранное

Главное меню » Операционная система Linux » 5 практических примеров команды read в Linux

С помощью команды read вы можете сделать ваш bash-скрипт интерактивным, принимая вводимые пользователем данные. Научитесь использовать команду чтения в Linux с этими практическими примерами.

Что такое команда read в Linux?

Другими словами, если вы хотите, чтобы ваш bash-скрипт принимал ввод от пользователя, вам придется использовать команду read.

Мы собираемся написать несколько простых скриптов bash, чтобы показать вам практическое использование команды read.

Прочитайте примеры команды read

Команда read может сбить с толку, особенно для тех, кто плохо знаком со сценариями оболочки. Сценарии, которые мы собираемся использовать здесь, очень просты для понимания и должны легко следовать, особенно если вы практикуете вместе с учебным пособием.

Основные концепции программирования

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

Когда вы используете read, вы связываетесь с терминалом bash, который хотите захватить ввод от пользователя. По умолчанию команда создаст переменную для сохранения этого ввода.

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

1. Команда read без параметров

Когда вы печатаете read без каких-либо дополнительных опций, вам нужно нажать Enter, чтобы начать захват. Система будет захватывать ввод, пока вы снова не нажмете ввод.

По умолчанию эта информация будет храниться в переменной с именем $REPLY.

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

Подробнее о переменных

Как мы упоминали ранее, переменная $REPLY встроена в read, поэтому вам не нужно объявлять ее.

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

Когда вы хотите вызвать переменную, вы будете использовать $ перед именем. Вот пример, где мы создаем переменную AndreyEx и присваиваем ей значение ввода.

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

image



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

  • Отображение выводимых данных на экране.
  • Перенаправление вывода в файл.

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

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

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

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

STDIN

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

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

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

STDOUT

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


То, что выведет pwd , будет добавлено к файлу myfile , при этом уже имеющиеся в нём данные никуда не денутся.

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

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

STDERR

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

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

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

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

После выполнения команды то, что предназначено для STDERR и STDOUT , оказывается в файле content .

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

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

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

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


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

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

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

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

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

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

Если просмотреть файл, указанный в команде перенаправления вывода, окажется, что всё, что выводилось командами echo , попало в этот файл.

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


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

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

Сначала команда exec задаёт перенаправление вывода из STDERR в файл myerror . Затем вывод нескольких команд echo отправляется в STDOUT и выводится на экран. После этого команда exec задаёт отправку того, что попадает в STDOUT , в файл myfile , и, наконец, мы пользуемся командой перенаправления в STDERR в команде echo , что приводит к записи соответствующей строки в файл myerror.

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

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

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


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


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

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

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

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

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

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


После запуска скрипта часть вывода попадёт на экран, часть — в файл с дескриптором 3 .

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

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

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

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

В этом примере дескриптор файла 6 использовался для хранения ссылки на STDIN . Затем было сделано перенаправление ввода, источником данных для STDIN стал файл. После этого входные данные для команды read поступали из перенаправленного STDIN , то есть из файла.

После чтения файла мы возвращаем STDIN в исходное состояние, перенаправляя его в дескриптор 6 . Теперь, для того, чтобы проверить, что всё работает правильно, скрипт задаёт пользователю вопрос, ожидает ввода с клавиатуры и обрабатывает то, что введено.

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

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

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

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

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

Для того, чтобы получить список всех открытых в Linux дескрипторов, можно воспользоваться командой lsof . Во многих дистрибутивах, вроде Fedora, утилита lsof находится в /usr/sbin . Эта команда весьма полезна, так как она выводит сведения о каждом дескрипторе, открытом в системе. Сюда входит и то, что открыли процессы, выполняемые в фоне, и то, что открыто пользователями, вошедшими в систему.

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

  • -p Позволяет указать ID процесса.
  • -d Позволяет указать номер дескриптора, о котором надо получить сведения.

Ключ -a используется для выполнения операции логического И над результатами, возвращёнными благодаря использованию двух других ключей:

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

Тип файлов, связанных с STDIN , STDOUT и STDERR — CHR (character mode, символьный режим). Так как все они указывают на терминал, имя файла соответствует имени устройства, назначенного терминалу. Все три стандартных файла доступны и для чтения, и для записи.

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


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

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

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

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


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

Итоги

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

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

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