Команда exec в linux

Обновлено: 04.07.2024

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

Процессы. Системные вызовы fork() и exec(). Нити.

Процесс в Linux (как и в UNIX) - это программа, которая выполняется в отдельном виртуальном адресном пространстве. Когда пользователь регистрируется в системе, автоматически создается процесс, в котором выполняется оболочка (shell), например, /bin/bash.

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

Ядро предоставляет системные вызовы для создания новых процессов и для управления порожденными процессами. Любая программа может начать выполняться только если другой процесс ее запустит или произойдет какое-то прерывание (например, прерывание внешнего устройства).

В связи с развитием SMP (Symmetric Multiprocessor Architectures) в ядро Linux был внедрен механизм нитей или потоков управления (threads). Нить - это процесс, который выполняется в виртуальной памяти, используемой вместе с другими нитями процесса, который обладает отдельной виртуальной памятью.

Если интерпретатору (shell) встречается команда, соответствующая выполняемому файлу, интерпретатор выполняет ее, начиная с точки входа (entry point). Для С-программ entry point - это функция main. Запущенная программа тоже может создать процесс, т.е. запустить какую-то программу и ее выполнение тоже начнется с функции main.

Для создания процессов используются два системных вызова: fork() и exec. fork() создает новое адресное пространство, которое полностью идентично адресному пространству основного процесса. После выполнения этого системного вызова мы получаем два абсолютно одинаковых процесса - основной и порожденный. Функция fork() возвращает 0 в порожденном процессе и PID (Process ID - идентификатор порожденного процесса) - в основном. PID - это целое число.
Теперь, когда мы уже создали процесс, мы можем запустить программу с помощью вызова exec. Параметрами функции exec является имя выполняемого файла и, если нужно, параметры, которые будут переданы этой программе. В адресное пространство порожденного с помощью fork() процесса будет загружена новая программа и ее выполнение начнется с точки входа (адрес функции main).

В качестве примера рассмотрим этот фрагмент программы

if (fork()==0) wait(0);
else execl("ls", "ls", 0); /* порожденный процесс */

  1. Выделяется память для описателя нового процесса в таблице процессов
  2. Назначается идентификатор процесса PID
  3. Создается логическая копия процесса, который выполняет fork() - полное копирование содержимого виртуальной памяти родительского процесса, копирование составляющих ядерного статического и динамического контекстов процесса-предка
  4. Увеличиваются счетчики открытия файлов (порожденный процесс наследует все открытые файлы родительского процесса).
  5. Возвращается PID в точку возврата из системного вызова в родительском процессе и 0 - в процессе-потомке.

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

  1. окончание порожденного процесса (например, из-за системного вызова exit (см. ниже))
  2. возникновение исключительной ситуации
  3. сигналы, поступающие от пользователя при нажатии определенных клавиш.

Установить реакцию на поступление сигнала можно с помощью системного вызова signal
func = signal(snum, function);

snum - номер сигнала, а function - адрес функции, которая должна быть выполнена при поступлении указанного сигнала. Возвращаемое значение - адрес функции, которая будет реагировать на поступление сигнала. Вместо function можно указать ноль или единицу. Если был указан ноль, то при поступлении сигнала snum выполнение процесса будет прервано аналогично вызову exit. Если указать единицу, данный сигнал будет проигнорирован, но это возможно не для всех процессов.

С помощью системного вызова kill можно сгенерировать сигналы и передать их другим процессам.
kill(pid, snum);
где pid - идентификатор процесса, а snum - номер сигнала, который будет передан процессу. Обычно kill используется для того, чтобы принудительно завершить ("убить") процесс.
Pid состоит из идентификатора группы процессов и идентификатора процесса в группе. Если вместо pid указать нуль, то сигнал snum будет направлен всем процессам, относящимся к данной группе (понятие группы процессов аналогично группе пользователей). В одну группу включаются процессы, имеющие общего предка, идентификатор группы процесса можно изменить с помощью системного вызова setpgrp. Если вместо pid указать -1, ядро передаст сигнал всем процессам, идентификатор пользователя которых равен идентификатору текущего выполнения процесса, который посылает сигнал.

Сигналы (точнее их номера) описаны в файле singnal.h

Для нормального завершение процесса используется вызов
exit(status);
где status - это целое число, возвращаемое процессу-предку для его информирования о причинах завершения процесса-потомка.
Вызов exit может задаваться в любой точке программы, но может быть и неявным, например при выходе из функции main (при программировании на C) оператор return 0 будет воспринят как системный вызов exit(0);

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

Практически все операционные системы обладают механизмом перенаправления ввода/вывода. Linux не является исключением из этого правила. Обычно программы вводят текстовые данные с консоли (терминала) и выводят данные на консоль. При вводе под консолью подразумевается клавиатура, а при выводе - дисплей терминала. Клавиатура и дисплей - это, соответственно, стандартный ввод и вывод (stdin и stdout). Любой ввод/вывод можно интерпретировать как ввод из некоторого файла и вывод в файл. Работа с файлами производится через их дескрипторы. Для организации ввода/вывода в UNIX используются три файла: stdin (дескриптор 1), stdout (2) и stderr(3).

Символ > используется для перенаправления стандартного вывода в файл.
Пример:
$ cat > newfile.txt Стандартный ввод команды cat будет перенаправлен в файл newfile.txt, который будет создан после выполнения этой команды. Если файл с этим именем уже существует, то он будет перезаписан. Нажатие Ctrl + D остановит перенаправление и прерывает выполнение команды cat.

Символ < используется для переназначения стандартного ввода команды. Например, при выполнении команды cat > используется для присоединения данных в конец файла (append) стандартного вывода команды. Например, в отличие от случая с символом >, выполнение команды cat >> newfile.txt не перезапишет файл в случае его существования, а добавит данные в его конец.

Команды для управления процессами

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

Параметр Описание
-a отобразить все процессы, связанных с терминалом (отображаются процессы всех пользователей)
-e отобразить все процессы
-t список терминалов отобразить процессы, связанные с терминалами
-u идентификаторы пользователей отобразить процессы, связанные с данными идентификаторыми
-g идентификаторы групп отобразить процессы, связанные с данными идентификаторыми групп
-x отобразить все процессы, не связанные с терминалом

Например, после ввода команды ps -a вы увидите примерно следующее:

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

Программа top

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

Изменение приоритета процесса - команда nice

nice [-коэффициент понижения] команда [аргумент]

Команда nice выполняет указанную команду с пониженным приоритетом, коэффициент понижения указывается в диапазоне 1..19 (по умолчанию он равен 10). Суперпользователь может повышать приоритет команды, для этого нужно указать отрицательный коэффициент, например --10. Если указать коэффициент больше 19, то он будет рассматриваться как 19.

nohup - игнорирование сигналов прерывания

nohup команда [аргумент]

nohup выполняет запуск команды в режиме игнорирования сигналов. Не игнорируются только сигналы SIGHUP и SIGQUIT.

kill - принудительное завершение процесса

kill [-номер сигнала] PID

где PID - идентификатор процесса, который можно узнать с помощью команды ps.

Команды выполнения процессов в фоновом режиме - jobs, fg, bg

Команда jobs выводит список процессов, которые выполняются в фоновом режиме, fg - переводит процесс в нормальные режим ("на передний план" - foreground), а bg - в фоновый. Запустить программу в фоновом режиме можно с помощью конструкции &

Команда exec заменяет текущий интерпретатор shell указанной командой. Обычно она используется для того, чтобы закрыть текущий интерпретатор и запустить другой. Но у нее есть и другое применение. Например, команда вида

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

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

9.1.4. Запуск новой программы: семейство exec()

9.1.4.4. Атрибуты, наследуемые exec()

9.1.4.4. Атрибуты, наследуемые exec() Как и в случае с fork(), после вызова программой exec сохраняется ряд атрибутов:• Все открытые файлы и открытые каталоги; см. раздел 4.4.1 «Понятие о дескрипторах файлов» и раздел 3.3.1 «Базовое чтение каталогов». (Сюда не входят файлы, помеченные для

9.4.3.1. Флаг close-on-exec

9.4.3.1. Флаг close-on-exec После вызова fork() и перед вызовом exec() следует убедиться, что новая программа наследует лишь те открытые файлы, которые ей нужны. Вы не захотите, чтобы порожденный процесс мешался в открытых файлах родителя, если только это так не задумано. С другой стороны,

10.9. Сигналы, передающиеся через fork() и exec()

10.9. Сигналы, передающиеся через fork() и exec() Когда программа вызывает fork(), ситуация с сигналами в порожденном процессе почти идентична ситуации в родительском процессе. Установленные обработчики остаются на месте, заблокированные сигналы остаются заблокированными и т.д.

4.7. Функции fork и exec

9.2.1.2 Функция exec в системе с замещением страниц

9.2.1.2 Функция exec в системе с замещением страниц Как уже говорилось в главе 7, когда процесс обращается к системной функции exec, ядро считывает из файловой системы в память указанный исполняемый файл. Однако в системе с замещением страниц по запросу исполняемый файл, имеющий

Exec (путь и название исполняемого файла)

Exec (путь и название исполняемого файла) Метод предназначен для выполнения команд и при своем вызове возвращает объект, с помощью которого можно управлять вызванной программой. Данный объект поддерживает следующие методы. ПРИМЕЧАНИЕ Выполнить команду можно также с

Команда

Команда Команда используется для выполнения SQL-запросов к базе данных Важно не путать команду, которая является СОМ-объектом, с текстом команды, который представляет собой строку. Обычно команды используют для описания данных, например для создания таблицы и

1.5. Действие команд fork, exec и exit на объекты IPC

1.5. Действие команд fork, exec и exit на объекты IPC Нам нужно достичь понимания действия функций fork, exec и _exit на различные формы IPC, которые мы обсуждаем (последняя из перечисленных функций вызывается функцией exit). Информация по этому вопросу сведена в табл. 1.4.Большинство функций

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

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

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

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

2.1.13. Опции -exec и -ok

2.1.13. Опции -exec и -ok Предположим, вы нашли нужные файлы и хотите выполнить по отношению к ним определенные действия. В этом случае вам понадобится опция -exec (некоторые системы позволяют с помощью опции -exec выполнять только команды ls илиls -l). Многие пользователи применяют

Подробное объяснение функций семейства exec в Linux

(1) описание функции exec:

Функция fork используется для создания дочернего процесса, дочерний процесс является почти копией родительского процесса, и иногда мы хотим, чтобы дочерний процесс выполнял другую программу, семейство функций exec предоставляет способ начать выполнение другой программы в процессе. Он может найти исполняемый файл в соответствии с указанным именем файла или именем каталога и использовать его для замены сегмента данных, сегмента кода и сегмента стека исходного вызывающего процесса.После выполнения все содержимое исходного вызывающего процесса является новым, за исключением номера процесса. Заменено содержание программы. К тому же,Исполняемый файл здесь может быть либо двоичным файлом, либо любым исполняемым файлом сценария в Linux.

Есть две основные ситуации использования семейства функций exec в Linux:

  • Когда процесс думает, что он больше не может вносить какой-либо вклад в систему и пользователей, он может вызвать любое семейство функций exec для регенерации.
  • Если процесс хочет выполнить другую программу, он может вызвать функцию fork для создания нового процесса, а затем вызвать любую функцию exec для регенерации дочернего процесса.

(2) синтаксис семейства функций exec

В Linux нет функции exec (), но есть шесть функций, начинающихся с exec, поэтому они называются семействами. Синтаксис между ними немного отличается. Ниже приводится описание библиотечной функции "man 3 execl" в справочной книге. Прототип функции выглядит следующим образом:

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

execl () и execv () Эти две функции являются самыми основными функциями exec, и обе могут использоваться для выполнения программы.Разница в том, что формат передачи параметров отличается. execl - это упорядочить список параметров (по сути, несколько строк, должны заканчиваться NULL) по порядку (l на самом деле является сокращением списка), execv - заранее поместить список параметров в массив строк, а затем поместить этот символ Массив строк передается в функцию execv.

execlp и execvp Эти две функции добавляют p на основе двух вышеупомянутых. По сравнению с двумя вышеупомянутыми, разница заключается в том, что две указанные выше программы выполнения должны указывать полный путь к исполняемой программе (если exec не находит файл пути, Сообщите об ошибке напрямую), и передача с помощью p может быть файлом (или путем, но он совместим с файлом. Две функции с p сначала найдут файл, если найден, выполнят его, если нет, то Перейдет в каталог, указанный переменной среды PATH для поиска, если найден, выполнит, если не найден, сообщит об ошибке)

По сравнению с execl () и execv (), execle и execvpe добавили e (обратите внимание, что p не удаляется из имени функции execvpe, причина будет объяснена позже), и есть дополнительный массив строк в списке параметров функции Параметр envp, e - значение переменной среды среды.Отличие от базовой версии exec в том, что при выполнении исполняемой программы массив переменных среды передается программе для выполнения. Если пользователь не передает третий параметр при выполнении этой программы, программа автоматически наследует копию переменной среды от родительского процесса (значение по умолчанию, изначально полученное из переменной среды в ОС); если мы используем execlp или execvpe при выполнении Передайте массив envp, фактическая переменная среды в программе - это та, которую мы передали (заменяет переменную по умолчанию, унаследованную от родительского процесса)

(3) Примеры использования функции

Примечание: execl ("/ bin / ls", "ls", "-l", "-a", NULL); Метод передачи параметров в этом операторе, первый параметр - это абсолютный путь к исполняемой программе, Параметр "ls", который следует ниже, не имеет практического применения в реальном тесте (даже если это не команда ls, не имеет значения, является ли это другой командой. Например, второй параметр - "pwd". Конкретная причина не ясна. , Надеюсь эксперт вас научит), но здесь необходимо заполнить строку, чтобы параметры можно было нормально разобрать.

Разница между этой функцией и execl () заключается в том, что команда и строка назначаются массиву строк, а затем передаются в качестве параметра функции. На самом деле суть та же.

функции execlp () и execvp

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

функции execle () и execvpe ()

Фактически, единственный реальный системный вызов - это execve () (вот почему "p" не удаляется при именовании системного вызова execvpe). Прототип функции выглядит следующим образом: все вышеуказанные функции являются библиотечными функциями, и в конечном итоге они будут вызываться execve () этот системный вызов

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

  • Не удается найти файл или путь, для ошибки установлено значение ENOENT.
  • Массивы argv и envp забывают заканчиваться на NULL, в это время для errno установлено значение EFAULT
  • Нет разрешения на выполнение, соответствующего исполняемому файлу, в это время для errno установлено значение EACCES.

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

Дополнение: О передаче параметров основной функции.

Прототип основной функции на самом деле больше, чем int main (int argc, char ** argv) или nt main (int argc, char * argv [])

Это также может быть int main (int argc, char ** argv, char ** env) Третий параметр - это массив строк, а содержимое - это переменные среды.

Примечание: этот блог представляет собой резюме, основанное на видео г-на Чжу Юпэна.

В прошлый раз, в третьей части этой серии материалов по 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, о том, как обрабатывать их в сценариях, о запуске заданий по расписанию и о фоновых задачах.

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