Зачем мне 'exec', если 'while read' может открыть 'File Descriptor'

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

Для этого просто выполните следующие действия:

$ sudo yum groupinstall "GNOME Desktop"
$ ln -sf /lib/systemd/system/runlevel5.target /etc/systemd/system/default.target

Затем просто перезагрузитесь.

Последний бит будет связывать целевой уровень запуска 5 как ваш по умолчанию по отношению к Systemd.

Выполнение с помощью Systemd

Для этого также можно использовать Systemd. Это, пожалуй, лучший метод, поскольку вы управляете состоянием системы напрямую через Systemd и его интерфейсы командной строки.

Вы можете увидеть текущую цель по умолчанию:

$ sudo systemctl get-default
multi-user.target

А затем изменить ее на графическую:

$ sudo systemctl set-default graphical.target

Цели

В Systemd цели runlevel5.target и graphical.target идентичны. То же самое с runlevel2.target и multi-user.target.

Runlevel    Target Units                          Description
0           runlevel0.target, poweroff.target     Shut down and power off the system.
1           runlevel1.target, rescue.target       Set up a rescue shell.
2           runlevel2.target, multi-user.target   Set up a non-graphical multi-user system.
3           runlevel3.target, multi-user.target   Set up a non-graphical multi-user system.
4           runlevel4.target, multi-user.target   Set up a non-graphical multi-user system.
5           runlevel5.target, graphical.target    Set up a graphical multi-user system.
6           runlevel6.target, reboot.target       Shut down and reboot the system.

Ссылки

1
24.04.2019, 03:11
1 ответ

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

Метод 1 может быть немного более прозрачным в отношении времени жизни fd (он не ограничивается только циклом while в любом случае )и помещает источник ближе к тому месту, где он используется. Я, вероятно, предпочел бы написать так для ясности, но практической разницы нет. Дескриптор файла должен быть закрыт после этого в любом случае.

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


Обратите внимание, что while readне открывает дескриптор файла :выполняются обычные операции перенаправления оболочки, которые существуют для любой команды с whileили execв качестве команды. Цикл whileсчитается одной составной командой и выполняется внутри вызывающей оболочки. Все обычные вещи, которые могут быть присоединены к команде, также могут быть связаны с циклом while.

Существует некоторое особое поведение для перенаправлений с execпри перенаправлении стандартного потока ввода-вывода (или другого уже -открытого FD ):он будет постоянно манипулировать текущей средой оболочки, и не только подоболочка, которая запускает реальную команду. Однако это не относится к этой ситуации с {newFD}<....

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

: <{newFD} <(...)

делает то же самое, что и exec {newFD}< <(...).

0
28.01.2020, 00:13

Теги

Похожие вопросы