Создает ли bash дочерний процесс для выполнения каждой команды

Насир Райли объяснил, как запустить Discord из архива , который вы скачали; однако в Ubuntu есть лучший подход. Вместо этого вам следует загрузить пакет формата.deb-и установить его либо двойным -щелчком по нему, либо с терминала:

cd ~/Downloads
sudo apt install./discord*deb

После этого вы найдете Discord доступным, как и любое другое приложение, из панели запуска.

0
04.11.2021, 18:50
2 ответа

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

Исключение составляют встроенные команды оболочки. Bash сам реализует некоторые стандартные утилиты, такие как printf, echo, true, false, killи [/test, поэтому их запуск не требует разветвления потомка. То же самое относится к таким вещам, как cd, readи mapfile, хотя они влияют на внутреннее состояние оболочки, поэтому их нужно встраивать.

(Также break, continueи return, которые, как ни странно, являются встроенными утилитами, а не ключевыми словами оболочки, такими как ifи while.)

Оболочка действительно не может запустить внешнюю программу в одном процессе с самой собой, сохраняя при этом возможность вернуться назад. Однако оболочка может заменить себя другой программой. Например. если вы запустите echo $$, чтобы увидеть PID оболочки, а затем запустите exec ps, вы увидите, что psработает с тем же PID. И когда psзавершается, эта оболочка больше не существует. На самом деле, подобное происходит каждый раз, когда вы запускаете программу обычным способом, просто оболочка делает копию себя (системным вызовом )fork()перед заменой дочерней программы для запуска(execve()). Между тем программа оболочки, работающая в дочернем процессе, заботится о настройке любых перенаправлений и тому подобного для дочернего процесса.

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

4
04.11.2021, 21:07

Да, для почти любая команда [1].

За исключением команд, реализованных в виде встроенных -модулей, список которых можно получить с помощью helpв bash [2].

Обратите внимание, что bash также разветвляется при запуске подоболочек, даже если они запускают только встроенные модули; например. в (echo a | read p)у вас есть 3 отдельных процесса поверх того, который запускает основную оболочку.

[1] Первоначальная идея самой первой оболочки Unix (, оболочки Thompson ), заключалась в том, что все команды должны быть отдельными двоичными файлами и выполняться как отдельные процессы. Однако из-за конструктивных ограничений и особенностей реализации это быстро развалилось, так как сначала chdirнужно было реализовать как встроенный -, затем назначение переменных и так далее. Дальнейшие снаряды все больше и больше размывали первоначальную идею.

[2] Даже при запуске встроенных функций bash пытается имитировать отдельные процессы; например, перенаправление из echo > fileобрабатывается совершенно другим (и очень сложным )способом, чем перенаправление из ls > file, чтобы сохранить иллюзию того, что echoвыполняется как отдельная команда, и перенаправление не применяется ко всей оболочке, а только к команде echo. Bash не всегда понимает это правильно; например, в

bash -c 'trap "echo Ctrl-C" INT; read p; echo DONE'

ловушка INTне будет выполнена после возврата команды read, как это произошло бы с любой другой командой (другие оболочки, такие как dash, понимают это правильно ). Кроме того, блокировка, встроенная -в echo, может возвращаться с глупым «Прерванным системным вызовом», чего внешний /bin/echoникогда не сделает (, поскольку echoне должен и не устанавливает никаких обработчик сигналов;-))--и тысячи подобных случаев, когда кладж проступает сквозь швы.

NB :busybox не имеет ничего общего с этим --busybox является примером бинарного кода -multi call, программы, которая может выполнять различные функции в зависимости от первого аргумента командной строки; точно так же, как ex/vi, od/hexdumpи т. д. Однако апплеты из busybox (, включая его оболочки, ashиhush)могут запускать некоторые другие апплеты, поскольку тот же процесс построен -дюймы,если специально скомпилирован таким образом (апплетыNOFORK/NOEXEC).

4
04.11.2021, 21:19

Теги

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