Термин «оболочка» хорошо назван. Это буквально оболочка вокруг O/S, позволяющая пользователю взаимодействовать с компьютером. Когда он был задуман, было очень мало графических пользовательских интерфейсов (без окон :(). Все было сделано в командной строке. Но даже командной строке нужно место для жизни. Он жил и до сих пор живет в раковине.
Проще говоря, чтобы командная строка была полезной, ей нужны инструкции, которые она могла бы вызвать. Таким образом, были созданы программы для запуска внутри оболочки для использования в командной строке. Программы были сгруппированы в свои собственные пакеты и предназначены для совместной работы. Они включают такие программы, как "ls" и "grep", "ps", "sed" и т.д. Они также включают команды перенаправления файлов, такие как ">" и "<", а также каналы ("|"). Что еще более важно, они также включают в себя программные конструкции, такие как условные операции (если, тогда, еще, для циклов, в то время как циклы, способы проверки состояния, возвращаемого при выполнении оператора (например, если вы запустили "ls", он что-нибудь нашел?) как это). Это основа более сложных сценариев командной строки (оболочки) и фактически является интерпретатором командной строки.
Когда кто-то использует термин «Bash Shell», он говорит о интерпретаторе командной строки «Bash», который запускается в оболочке O/S. Вы можете думать об этом как о сокращении «Bash Shell Interpreter». Есть и другие переводчики, такие как Bourne (Bash - это новая и улучшенная оболочка Bourne Shell, а для Bourne Again Shell она сокращена). Есть также C-Shell, K-Shell (любимый многими, кто пишет сложные сценарии оболочки), и другие варианты GNU. С годами стало привычным ссылаться на конкретного интерпретатора командной строки, который вы используете в качестве оболочки, потому что один не может использоваться без другого. Но реальность такова, что они разные.
Что касается того, почему они должным образом известны как интерпретаторы командной строки, а не как фактическая оболочка: это потому, что они живут в оболочке и интерпретируют все команды, как если бы они выполнялись в программе. И оболочке все равно, какой интерпретатор вы используете в ней, если она соответствует правильным стандартам.
И то, почему они называются переводчиками, это потому, что они действительно переводчики. Даже если вы не запускаете скрипт явно (а скрипт на самом деле представляет собой просто текстовый файл команд, которые вы создаете, чтобы вы могли выполнять одни и те же команды снова и снова без необходимости их повторного ввода). Например, возьмите смиренную команду «ls». Когда вы запускаете его, он возвращает список файлов. Но то, как он работает, более важно для вашего вопроса: он на самом деле работает внутри контекста интерпретатора командной строки, даже если вы просто запускаете то, что кажется простой командой off. То есть он работает так, как если бы он был частью более крупной программы. Он работает так, как если бы он находился в файле сценария сценария оболочки, фактически не находясь в файле сценария оболочки. Файл сценария анонимной оболочки как бы.
Все, что вы запускаете в командной строке, имеет это общее (будь то отдельная команда, такая как 'ls' или файл сценария, полный команд, итераторов и условных операторов): все это обрабатывается интерпретатором командной строки; будь то Bash, C-Shell, K-Shell (по умолчанию в AIX, кстати).
Чтобы понять, что я имею в виду, создайте каталог 'test':
mkdir test
Введите его и выполните следующие команды
grep hello *
Вы получите ответ вроде «нет такого файла или каталога». Теперь введите команду
echo $?
($? говорит, скажи мне, что вы нашли в загадочном компьютере говорить.) Вы должны увидеть, как он возвращает число (должно быть) '2'. Это код возврата от grep, который означает «нет такого файла или каталога». Теперь запустите следующее:
echo hello > hello.txt
grep hello *
echo $?
Вы увидите файл 'hello.txt', возвращенный из начальной команды grep, и теперь должны увидеть 'echo $?'вернуть число' 0 ', означающее, что он действительно что-то нашел.
Даже если эти, казалось бы, единственные команды запускаются, интерпретатор командной строки действует так, как будто он является частью более крупной программы, и отслеживает их возвращаемые значения. Вот почему, если вы забудете * в конце команды grep, она не вернется. Он знает, что утверждение является неполным и ожидает большего ввода. В конце концов, вы, возможно, захотите попросить его отобразить результаты некоторого цикла, который абсолютно допустим для написания и запуска в командной строке.
Суть в том, что оболочка - это оболочка, и интерпретатор (независимо от того, какое имя вы используете, 'Bash', k-shell и т.д.) Различаются. Но часто они используются взаимозаменяемо, потому что в любой момент они полностью связаны друг с другом.