Ядро Linux и пользовательское пространство дистрибутива Linux, в котором исторически доминировали пользовательские инструменты, разработанные в рамках проекта GNU, слабо связаны. Отчасти это по замыслу, отчасти по необходимости.
В отличие от BSD, где ядро и базовое пользовательское пространство разрабатываются и поддерживаются вместе, ядро Linux и его пользовательское пространство разрабатывались и поддерживаются разными людьми. Так что держать их тесно связанными вместе было бы сложно, даже если бы сообщество захотело этого, а я не думаю, что оно этого хочет.
И @sebasth также прекрасно отмечает, что основная политика проекта ядра Linux заключается в том, что он не должен нарушать пространство пользователя. Что, конечно же, является еще одним фактором, усиливающим слабую связанность.
Тем не менее, некоторая степень связи все еще существует. Достаточно старое ядро Linux не будет работать с современными дистрибутивами.
$ type kill
kill is a shell builtin
Запуск только kill -l
запускает встроенную версию оболочки. Но sudo
не запускает свои команды через оболочку, поэтому вместо этого sudo kill -l
запускает /bin/kill
, найденный через $PATH
. Две разные реализации по сути одной и той же утилиты, просто у них немного разный формат вывода для -l
.
Аналогичный результат можно получить с любой утилитой, имеющей встроенную реализацию оболочки и внешнюю. Просто их не много. На ум приходят echo
и printf
, но встроенные версии Bash аналогичны версиям в GNU coreutils, по крайней мере, кроме этого:
$ echo --help # Bash
--help
$ /bin/echo --help # coreutils
Usage: /bin/echo [SHORT-OPTION]... [STRING]...
or: /bin/echo LONG-OPTION
Echo the STRING(s) to standard output.
...
(Оба также имеют printf --help
, с разными текстами.)
Причина, по которой оболочка имеет встроенную версию kill
, в основном заключается в том, что если вы нажмете ограничение на количество процессов, вы не сможете запустить новый процесс, чтобы завершить другие.