GNU/Linux >> Znalost Linux >  >> Linux

Je Sub-shell totéž jako Child-shell?

Existují tato dvě jména:subshell a skořápka pro děti .

Ano, podřízený proces bude spuštěn některým z těchto:

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

Jsou všechny rovnocenné a mají stejné jméno? Sdílejí všichni stejné vlastnosti?

POSIX má tuto definici:

Prostředí spouštění shellu se skládá z ….

Ale poslední odstavec výše uvedeného odkazu má toto:

Prostředí subshell by mělo být vytvořeno jako duplikát prostředí shellu, kromě toho, že depeše signálu, které nejsou ignorovány, musí být nastaveny na výchozí akci.

A speciálně:

Náhrada příkazů, příkazy, které jsou seskupeny se závorkami, a asynchronní seznamy se musí provádět v prostředí subshell. Kromě toho je každý příkaz z kanálu s více příkazy v prostředí subshell; ….

sh -c 'echo "Hello"' není tam zahrnuto, mělo by se to také nazývat subshell?

Přijatá odpověď:

Subshell duplikuje stávající skořápka. Má stejné proměnné¹, stejné funkce, stejné možnosti atd. Pod kapotou se pomocí fork vytvoří subshell systémové volání²; podřízený proces pokračuje dělat to, co se od něj očekává, zatímco rodič čeká (např. $(…) ) nebo pokračuje ve své životnosti (např. … & ) nebo jinak dělá to, co se od něj očekává (např. … | … ).

sh -c … nevytváří subshell. Spustí další program. Ten program je náhodou shell, ale to je jen náhoda. Program může být dokonce jiný shell (např. když spustíte sh -c … z bash a sh je pomlčka), tj. zcela odlišný program, který má náhodou významné podobnosti ve svém chování. Pod kapotou se spustí externí příkaz (sh nebo jakýkoli jiný) volá fork systémové volání a poté execve systémové volání nahradit shell program v podprocesu jiným programem (zde sh ).

¹ Včetně $$ , ale s výjimkou některých proměnných specifických pro shell, jako je bash a BASHPID mksh .
² Alespoň taková je tradiční a obvyklá implementace. Shelly mohou optimalizovat vidlici, pokud mohou napodobit chování jinak.

Související:Přesměrování výstupu subshell do procesu?

Příslušné manuálové stránky:fork(2), execve(2).


Linux
  1. Odkazovat na soubor ve stejném adresáři skriptu nalezeného v $path?

  2. Spustit příkaz Sudo a zadat heslo na stejném řádku?

  3. Spustit stejný skript na několika serverech přes Ssh?

  1. Přesměrovat na stejný soubor jako zdrojový soubor zpracovaný příkazem?

  2. Jsou tar.gz a tgz to samé?

  3. Proč je jádro mapováno do stejného adresního prostoru jako procesy?

  1. Procházejte okny stejné aplikace pomocí wmcrtl

  2. Kopírovat a chmod/chown zároveň

  3. Ping a tcpdump současně