Термін «оболонка» добре названий. Це буквально оболонка навколо O / S, що дозволяє користувачеві взаємодіяти з комп'ютером. Коли він спочатку був задуманий, було дуже мало, якщо якісь графічні інтерфейси користувача (без вікон :(). Все робилося в командному рядку. Але навіть командному рядку потрібно було жити. Він жив і досі працює в оболонці .
Простіше кажучи, для того, щоб командний рядок був корисним, потрібні були інструкції, які він може викликати. Таким чином, програми були запущені всередині оболонки для використання командного рядка. Програми були щільно згруповані у власні пакети, і вони мали на меті працювати разом. Вони включають такі програми, як "ls" та "grep", "ps", "sed" тощо. Вони також включають команди перенаправлення файлів, наприклад ">" та "<", і pipe ("|"). Що ще важливіше, вони також включають в себе такі програми програмування, як умовні операції (якщо, тоді, інакше, для циклів, тоді як цикли, способи перевірити стан, що повертається під час запуску оператора (наприклад, якщо ви запускаєте "ls", це щось знайшло?)) таким чином). Це основи складніших сценаріїв командного рядка (оболонки),
Коли хтось використовує термін "Bash Shell", вони говорять про інтерпретатора командного рядка під назвою "Bash", який працює в оболонці O / S. Ви можете подумати про це як короткий перекладач "Bash Shell Interpreter". Є й інші перекладачі, такі як Борн (Bash - це «нова і вдосконалена оболонка Борна, і це коротке за Bourne Again Shell»). Існують також C-Shell, K-Shell (перевагу багатьох, хто пише складні сценарії оболонки), та інші варіанти GNU. З роками стало звичним посилатися на конкретний інтерпретатор командного рядка, який ви використовуєте як оболонку, оскільки один не може бути використаний без іншого. Але реальність така, що вони різні.
Щодо того, чому вони належним чином відомі як інтерпретатори командного рядка, а не як фактична оболонка: це тому, що вони живуть у оболонці та інтерпретують усі команди так, ніби вони виконують програму. І оболонці неважливо, який інтерпретатор ви запускаєте в ньому, якщо він відповідає правильним стандартам.
А щодо того, чому їх називають перекладачами, це тому, що вони справді перекладачі. Навіть якщо ви явно не виконуєте сценарій (а сценарій насправді є лише текстовим файлом команд, які ви створюєте, щоб ви могли виконувати одні й ті ж команди знову і знову без необхідності вводити їх знову). Наприклад, візьміть скромну команду 'ls'. Після запуску він повертає список файлів. Але те, як він працює, важливіше для вашого питання: він насправді працює в контексті інтерпретатора командного рядка, навіть якщо ви просто запускаєте те, що видається простою командою. Тобто це працює так, ніби це було заявою в частині більшої програми. Він працює так, ніби він був у файлі сценарію скрипта оболонки, фактично не знаходиться у файлі сценарію оболонки. Анонімний сценарій файлу оболонки як би.
Все, що ви запускаєте в командному рядку, має це спільне (будь то окрема команда на зразок 'ls' або файл сценарію, наповнений командами та ітераторами та умовними висловлюваннями): це все обробляється інтерпретатором командного рядка; будь то Bash, C-Shell, K-Shell (за замовчуванням AIX btw).
Щоб побачити, що я маю на увазі, зробіть каталог "test":
mkdir test
Введіть його і виконайте наступні команди
grep hello *
Ви отримаєте такий варіант відповіді, як "немає такого файлу чи каталогу". Тепер введіть команду
echo $?
($? каже, скажіть мені, що ви знайшли в криптовалюті, говоріть.) Ви повинні побачити, що він повертає число (воно повинно бути) "2". Це зворотний код з grep, що означає "немає такого файлу чи каталогу". Тепер запустіть наступне:
echo hello > hello.txt
grep hello *
echo $?
Ви побачите файл "hello.txt", повернутий з початкової команди grep, і тепер має відображатися "echo $?" поверніть число '0', тобто воно щось знайшло.
Навіть якщо ці команди, що здаються одноразовими, виконуються, інтерпретатор командного рядка діє так, ніби вони є частиною більшої програми та відслідковує їх повернені значення. Ось чому, якщо ви забудете * в кінці команди grep, він не повернеться. Він знає, що твердження є неповним і очікує більше вкладу. Зрештою, ви могли б попросити його прослідкувати результати певного циклу, який цілком законно писати та запускати в командному рядку.
Підсумок - оболонка - оболонка, а інтерпретатор (незалежно від назви того, хто ви використовуєте, "Bash", k-shell тощо). Але часто вони використовуються взаємозамінно, оскільки в будь-який момент вони повністю зв'язані між собою.