Вопрос или проблема
Моя система – Debian 9.4
, которая использует linux kernel 4.9.0-8-amd64
, и команда echo $SHELL
на моей системе выводит /bin/bash
, а /bin/sh
является ссылкой на /bin/dash
.
Мне стало интересно, почему каждый раз, когда я запускаю приложение с помощью dmenu_run
из dwm
, создается дополнительный процесс /bin/bash
, который работает как родительский, поэтому я углубился в скрипт dmenu_run
:
#!/bin/sh
dmenu_path | dmenu "$@" | ${SHELL:-"/bin/sh"} &
Я не могу понять, почему на моем компьютере запускается /bin/bash
вместо /bin/sh
. Я также прочитал соответствующий исходный код в dwm
. Он показывает, что просто осуществляется fork
и execvp
dmenu_run
. Нет причин, по которым /bin/bash
должен запускаться вместо /bin/sh
.
Обычно /bin/sh
является символической ссылкой на /bin/bash
в системах, которые используют bash
в качестве оболочки по умолчанию.
Ответ или решение
dmenu_run — это небольшая, но мощная утилита, которая используется в системах на базе X11, например, в оконных менеджерах, таких как dwm. Основная функция dmenu_run — предоставлять графический интерфейс для запуска приложений из командной строки. Давайте более подробно разберем, как он работает и почему на вашем устройстве появляется дополнительный процесс bash.
Как работает dmenu_run
Основной сценарий, который вы привели, выглядит следующим образом:
#!/bin/sh
dmenu_path | dmenu "$@" | ${SHELL:-"/bin/sh"} &
-
Область применения dmenu_path:
dmenu_path
генерирует список доступных программ, основываясь на переменной среды PATH. Этот список подается на вход кdmenu
, который предоставляет пользователю удобный интерфейс для выбора приложения.
-
Работа dmenu:
dmenu
— это инструмент, который отображает графический интерфейс. Пользователь может начать вводить название программы, и dmenu будет фильтровать список в реальном времени. После выбора приложения, dmenu возвращает его название на стандартный вывод.
-
Запуск приложения:
- Конструкция
${SHELL:-"/bin/sh"}
используется для выполнения выбранного приложения. Она проверяет, какая оболочка задана в переменной окружения SHELL. Если она не установлена, используется/bin/sh
по умолчанию. Поскольку в вашей системе переменная SHELL указывает на/bin/bash
, именно эта оболочка запускает выбранное приложение.
- Конструкция
Почему запускается /bin/bash?
В Debian (включая вашу версию 9.4), часто /bin/sh
является символической ссылкой на /bin/bash
(или на другую оболочку, в зависимости от конфигурации системы). Ваша система имеет bash в качестве стандартной оболочки, и поэтому процесс запускается именно через него. Это объясняет, почему вы видите дополнительный процесс /bin/bash
в дереве процессов, когда используете dmenu_run.
Подводя итог
Основная причина, по которой при запуске dmenu_run появляется дополнительный процесс /bin/bash
, заключается в том, что:
- Ваша система настроена так, что оболочка по умолчанию для запуска программ — это
bash
. - dmenu_run использует переменную SHELL для определения, какая оболочка будет использоваться для запуска выбранного приложения.
Таким образом, любой раз, когда вы вызываете dmenu_run
, он создает новый процесс оболочки (в вашем случае, bash) для выполнения вашего приложения, что также может быть полезно для обработки скриптов или команд, которые зависят от особенностей bash.
Если вы хотите изменить это поведение, вы можете обновить переменную окружения SHELL на другие оболочки, или изменить привязку для /bin/sh
на другую оболочку, например, dash или ash, в соответствии с вашими предпочтениями.
Надеюсь, на ваш вопрос была дана исчерпывающая и детальная информация.