Bash - одна из популярных оболочек командной строки, программ, основной задачей которых является запуск других программ (в дополнение к некоторым вспомогательным функциям).
Часть командной строки означает, что вы управляете ею, набирая команды по одной строке за раз.
Собственно говоря, графический интерфейс, который вы используете для запуска программ двойным щелчком по значку, также является оболочкой, но на практике под "оболочкой" люди обычно подразумевают командную строку.
Все современные оболочки командной строки принимают свои данные и отправляют их в виде абстрактных потоков символов, а другие концы этих потоков могут быть подключены к клавиатуре, принтеру, файлу, другой программе. Оболочке по большей части все равно - она читает символы, интерпретирует их как команды, указывающие на запуск других программ, и записывает символы, такие как "команда не найдена". Когда он запускает другую программу, по умолчанию он соединяет входы и выходы этой программы с теми же потоками.
Теперь Terminal - это программа, которая обеспечивает графический интерфейс между оболочкой и пользователем. Он получает от оболочки, например, символы "команда не найдена", и выясняет, как их отобразить - каким шрифтом, где на экране, каким цветом, должна ли быть полоса прокрутки. Когда вы нажимаете некоторые клавиши, он выясняет, следует ли отправлять их в оболочку в виде символов (например, ls -l
), или интерпретировать их самостоятельно (например, ⌘C).
Когда вы открываете приложение Terminal, оно автоматически открывает оболочку для подключения к вам. В его настройках вы можете выбрать другую оболочку из Bash. Если вы чувствуете себя дерзким, вы можете даже заставить его использовать программу, которая вовсе не является оболочкой - не слишком полезной, но она демонстрирует, как Терминал заботится только о передаче символов внутрь, а не о том, что оболочка делает с ними ,
Что происходит, когда вы вводите bash
в Bash (через терминал)? Запускает программу Bash - то есть еще одну копию себя внутри себя.
ETA: подсказка, которую Bash дает вам перед тем, как вы наберете каждую команду, является удобной для настройки и контролируется (в специальном формате) переменной PS1
. Попробуйте ввести echo $PS1
в родительском и дочернем экземплярах Bash.
При запуске из приложения «Терминал» эта переменная задает запрос на ввод имени компьютера, каталога и пользователя. Это настроено для вас в /etc/bashrc
, но вы можете установить новое значение, в идеале в ~/.bash_profile
. NB. это в некоторой степени зависит от OSX; в большинстве других систем вы бы предпочли ~/.bashrc
для этого.
Когда вы просто запускаете дочерний экземпляр Bash, /etc/bashrc
не выполняется повторно, поэтому эта переменная не устанавливается. Он также не настроен для наследования дочерними оболочками (что совершенно необходимо для переменных среды), поэтому Bash возвращается к бесполезному стандартному значению - просто показывает, какая версия запущена.