Це суб-оболонка те саме, що і дочірня оболонка


11

Є ці два назви: нижня оболонка та дочірня оболонка .

Так, дочірнім процесом буде розпочато будь-що з цього:

sh -c 'echo "Hello"'
( echo "hello" )
echo "$(echo "hello")
echo "hello" | cat

Чи всі еквівалентні і мають одне ім’я? Чи всі мають однакові властивості?


POSIX має таке визначення :

Середовище виконання оболонки складається з ....

Але останній абзац вище посилання має таке:

Навколишнє середовище додаткової оболонки має бути створено як дублікат середовища оболонки, за винятком того, що сигнальні пастки, які не ігноруються, встановлюються на дію за замовчуванням.

І спеціально:

Підстановка команд, команди, згруповані з дужками, і асинхронні списки, виконуються в середовищі додаткової оболонки. Крім того, кожна команда трубопроводу з декількома командами знаходиться в середовищі нижньої оболонки; ….

Це sh -c 'echo "Hello"'не включено туди, чи слід це називати також підрозділом?

Відповіді:


14

Підскладинка дублює існуючу оболонку. У нього однакові змінні¹, ті ж функції, однакові параметри і т. Д. Під кришкою створюється forkнижня оболонка із системним викликом²; дочірній процес продовжує робити те, що від нього очікується, поки батько чекає (наприклад, $(…)) або продовжує своє життя (наприклад, … &) або іншим чином робить те, що від нього очікується (наприклад, … | …).

sh -c …не створює підшару. Він запускає іншу програму. Ця програма буває оболонкою, але це лише збіг обставин. Програма може навіть бути іншою оболонкою (наприклад, якщо ви біжите sh -c …з bash, і shє тире), тобто зовсім інша програма, яка, як буває, має значну схожість у своїй поведінці. Під кришкою запуск зовнішньої команди ( shабо будь-якої іншої) викликає forkсистемний виклик, а потім execveсистемний виклик для заміни програми оболонки в підпроцесі на іншу програму (тут sh).

¹ В тому числі $$, але , за винятком деяких конкретних оболонки змінні , такі як Баш і МКШ -х років BASHPID.
² Принаймні, це традиційна та звичайна реалізація. Оболонки можуть оптимізувати вилку, якщо вони можуть імітувати поведінку в іншому випадку.

Відповідні чоловічі сторінки: fork (2) , execve (2) .


Спасибі. До чого належить запуск сценарію bash з bash shebang?
Тим

@Tim Те саме, що sh -c: це підпроцес, який випадково буває оболонкою.
Жиль "ТАК - перестань бути злим"

(1) "запуск зовнішньої команди (sh або будь-яка інша) викликає виклик системної виклику, а потім системний виклик execve для заміни програми оболонки в підпроцесі на іншу програму (тут sh)." Чи правильно, що fork спочатку створює підзарядку, а потім execve замінює її на зовнішню програму? Тож у двох випадках у вашій відповіді завжди створюється підшлунок? (2) "Піддіаграма, що дублює існуючу оболонку." що це означає?
Тім

(3) у bash -c <command>, після розщеплення оболонки та після її виконання bash -c <command>, створюється оболонка bash. Тоді системний виклик використовується для <command>повторного розгортання розщеплення bash shell та execve <command>?
Тим

2
@cuonglm "Дочірня оболонка" - це не технічний термін із конкретним значенням, на відміну від "нижня оболонка". Якщо це оболонка, яка є дитиною, то це дочірня оболонка, дотримуючись звичайних англійських правил.
Жил "ТАК - перестань бути злим"

1

Навколишнє середовище під оболонки не потрібно жити в окремому процесі, воно просто має дублювати поточне середовище виконання. У ksh93цьому робиться virtual sub-shellмеханізм, який не викликає fork(). Це робить ksh93 дуже швидким на архаїчних платформах Win-DOS, як Win-DOSі надзвичайно повільно при розщепленні.

sh -c cmd з іншого боку створює новий процес із оболонкою за замовчуванням, яка не повинна бути такою, як ваша поточна інтерактивна оболонка.

Навіть коли shі ваша поточна оболонка однакові, це не дублює середовище виконання і, таким чином, не створює sub-shell.


Отже, в інших оболонках, крім ksh93, нижня оболонка є дочірньою оболонкою?
cuonglm

Я не знаю жодної іншої реалізації, яка сьогодні реалізує віртуальні підшарови.
schily
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.