Sub-shell Differenzen zwischen bash und ksh

7

Ich habe immer geglaubt, dass eine Sub-Shell kein Kindprozess ist, sondern eine andere Shell-Umgebung im selben Prozess.

Ich benutze einen grundlegenden Satz von eingebauten:

%Vor%

An einem anderen Terminal:

%Vor%

Also, kein Kindprozess in kornShell (ksh).

Geben Sie bash ein, es scheint sich bei demselben Befehl anders zu verhalten:

%Vor%

Also, ein Kindprozess in bash.
Beim Lesen der Man-Pages für bash ist es offensichtlich, dass ein anderer Prozess für eine Sub-Shell erstellt wird, Allerdings täuscht es $$, was sneeky ist.

Wird dieser Unterschied zwischen bash und ksh erwartet, oder lese ich die Symptome falsch?

Bearbeiten: zusätzliche Informationen: Das Ausführen von strace -f auf bash und ksh unter Linux zeigt, dass bash für den Beispielbefehl clone zweimal aufruft (es ruft nicht fork auf). Also Bash könnte Threads verwenden (Ich probierte ltrace , aber es ist Core Dump!). KornShell ruft weder fork , vfork noch clone auf.

    
cdarke 04.02.2013, 12:31
quelle

3 Antworten

9

ksh93 arbeitet ungewöhnlich schwer, um Subshells zu vermeiden. Ein Teil des Grundes ist die Vermeidung von stdio und die umfangreiche Verwendung von sfio ermöglicht es den eingebauten Geräten, direkt zu kommunizieren. Ein weiterer Grund ist, dass Ksh theoretisch so viele Builtins haben kann. Wenn sie mit SHOPT_CMDLIB_DIR erstellt wird, sind alle eingebauten cmdlib-Dateien standardmäßig enthalten und aktiviert. Ich kann keine umfassende Liste von Orten angeben, an denen Subshells vermieden werden, aber es ist in der Regel in Situationen, in denen nur Builtins verwendet werden und wo es keine Weiterleitungen gibt.

%Vor%

out:

%Vor%

Eine weitere nette Konsequenz dieser internen I / O-Behandlung ist, dass einige Pufferprobleme einfach verschwinden. Hier ist ein lustiges Beispiel für das Lesen von Zeilen mit tee und head builtins (versuchen Sie dies nicht in einer anderen Shell).

%Vor%     
ormaaj 09.03.2013, 14:50
quelle
11

In ksh führt eine Untershell möglicherweise zu einem neuen Prozess. Ich weiß nicht, wie die Bedingungen sind, aber die Shell wurde für die Leistung auf Systemen optimiert, auf denen fork() teurer war als normalerweise unter Linux. Daher wird vermieden, einen neuen Prozess zu erstellen, wann immer es möglich ist. Die Spezifikation sagt eine "neue Umgebung", aber diese Trennung der Umwelt kann im Prozess erfolgen.

Ein weiterer vage Unterschied ist die Verwendung neuer Verfahren für Rohre. Wenn in ksh und zsh der letzte Befehl in einer Pipeline eingebaut ist, wird er im aktuellen Shell-Prozess ausgeführt. Dies funktioniert folgendermaßen:

%Vor%

In der bash sind alle Pipeline-Befehle Subshells, also nicht:

%Vor%     
Mark Reed 04.02.2013 13:33
quelle
1

Die bash-Manpage lautet:

  

Jeder Befehl in einer Pipeline wird als separater Prozess (d. h. in einer Untershell) ausgeführt.

Während dieser Satz über Pipes handelt, impliziert er stark, dass eine Subshell ein separater Prozess ist.

Die Disambiguierungsseite von Wikipedia beschreibt auch eine Subshell in Kindprozeßbegriffen. Ein Kindprozess ist sicherlich selbst ein Prozess.

Die ksh-Manpage (auf einen Blick) ist nicht direkt in Bezug auf ihre eigene Definition einer Subshell, also impliziert sie nicht, dass eine Subshell ein anderer Prozess ist.

Den Korn lernen Shell sagt, dass es sich um unterschiedliche Prozesse handelt.

Ich würde sagen, du verpasst etwas (oder das Buch ist falsch oder veraltet).

    
kojiro 04.02.2013 13:03
quelle

Tags und Links