3

На Debian сожми. Запуск ps -p $$ показывает, что bash - это моя текущая оболочка, ls -l $(which sh) показывает, что sh является символической ссылкой на bash . Так почему, когда я запускаю man sh , я получаю man-страницу для dash? Это просто ошибка в Debian?

2 ответа2

8

Системная оболочка по умолчанию отличается от вашей пользовательской оболочки. В моей системе dash является системным значением по умолчанию, но я использую bash при входе в систему:

anthony@Zia:~$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar  1  2012 /bin/sh -> dash

Итак, скрипт оболочки с #!/bin/sh up работает с тире.

Похоже, ваша система каким-то образом пополам, где символьная ссылка /bin /sh и символическая ссылка manpage вышли из синхронизации. Символическая ссылка manpage в моей системе:

anthony@Zia:~$ ls -l /usr/share/man/man1/sh.1.gz 
lrwxrwxrwx 1 root root 9 Mar  1  2012 /usr/share/man/man1/sh.1.gz -> dash.1.gz

Если вы вручную изменили /bin /sh, вам придется изменить и его. Возможно, есть ошибка при обработке этих символических ссылок; mpy указывает на ошибку # 662159.

У каждого пользователя есть настройка, какую оболочку вызывать при входе в систему. Это настройка для каждого пользователя, которая хранится в /etc/passwd , поэтому системная страница руководства не может отразить ее. Каждый пользователь может изменить настройки своей оболочки, запустив chsh (и, конечно, root может изменить настройки оболочки других пользователей).

Существует также переменная среды SHELL , которая устанавливается при входе в систему, но может быть изменена. Обычно он переопределяет поле оболочки в /etc/passwd когда, например, xterm необходимо запустить оболочку.

1

TL; DR /bin /sh раньше был совершенно другой оболочкой в других UNIX (Solaris), но был Bash в Linux, но Debian решил использовать собственную оболочку /bin /sh по разным причинам (в основном размер кода).

Первоначальной оболочкой была раковина Борна. Правила POSIX требуют, чтобы Bourne-совместимая оболочка была установлена как /bin /sh. Это то, что вы получаете, когда спрашиваете man sh .

Оболочка Борна на самом деле была довольно сырой. У него не было много интерактивных функций, которые люди хотели бы видеть в командном интерпретаторе. у него не было механизма истории, псевдонимов и т. д. Поэтому были сделаны некоторые дополнения. Сначала это было в tcsh, затем в оболочке Korn, затем в Bash.

Когда вы создаете дистрибутив Linux, вам нужно следовать правилам POSIX для /bin /sh. Они увидели «эй, у нас есть Bash, совместимый с оболочкой Bourne». Почему бы нам просто не удалить из него несколько функций и установить его как /bin /sh? Большинство дистрибутивов сделали это.

Но с этим есть некоторые проблемы. Bash обладает множеством функций (привязки readline, программируемое завершение, словарные массивы и т.д.), И на самом деле он довольно большой по памяти и имеет несколько библиотечных зависимостей. Это не особенно хорошо, когда вы находитесь в режиме "моя система не работает". Вы больше заботитесь о том, чтобы запустить свою систему, чем беспокоитесь о том, есть ли у меня полностью программируемая подсказка в этот момент.

Итак, ребята из Debian вернулись в будущее и имеют специальную разорванную оболочку Bourne как /bin /sh. Это меньше, меньше зависимостей, и в теории может быть более надежным при запуске. Недостатком является то, что могут быть сценарии запуска, которые зависят от того, что /bin /sh действительно находится под Bash, и могут использовать эти функции. Но это скрипты, которые были закодированы вне спецификации и должны быть исправлены.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .