Насир Райли объяснил, как запустить Discord из архива , который вы скачали; однако в Ubuntu есть лучший подход. Вместо этого вам следует загрузить пакет формата.deb
-и установить его либо двойным -щелчком по нему, либо с терминала:
cd ~/Downloads
sudo apt install./discord*deb
После этого вы найдете Discord доступным, как и любое другое приложение, из панели запуска.
Да, почти каждая команда, которую вы запускаете в командной строке, выполняется в собственном процессе, и эти процессы являются дочерними элементами запускающей их оболочки.
Исключение составляют встроенные команды оболочки. 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 реализует большой набор стандартных утилит в одном программном файле. Но, насколько я проверял, он по-прежнему разветвляет дочерний элемент при их запуске, вероятно, потому, что это простой способ убедиться, что утилиты не вмешиваются в состояние оболочки без необходимости.
Да, для почти любая команда [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
).