Термин «оболочка» хорошо назван. Это буквально оболочка вокруг 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». Когда вы запускаете его, он возвращает список файлов. Но то, как он работает, более важно для вашего вопроса: он на самом деле работает в контексте интерпретатора командной строки, даже если вы просто запускаете то, что кажется простой командой без подключения. То есть он работает так, как если бы он был частью более крупной программы. Он работает так, как если бы он находился в файле сценария сценария оболочки, фактически не находясь в файле сценария оболочки. Файл сценария анонимной оболочки как бы.
Все, что вы запускаете в командной строке, имеет это общее (будь то отдельная команда, такая как '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 и т. Д.) Различаются. Но часто они используются взаимозаменяемо, потому что в любой момент они полностью связаны друг с другом.