Sub-shell Unterschiede zwischen bash und ksh
Habe ich immer geglaubt, dass eine sub-shell war nicht ein Kind-Prozess, aber ein anderes
shell-Umgebung, die in demselben Prozess.
Verwende ich einen grundlegenden Satz von built-ins:
(echo "Hello";read)
Auf einem anderen terminal:
ps -t pts/0
PID TTY TIME CMD
20104 pts/0 00:00:00 ksh
So, kein Kind-Prozess in der kornShell (ksh).
Geben Sie bash, es scheint, sich anders zu Verhalten, da Sie den gleichen Befehl:
PID TTY TIME CMD
3458 pts/0 00:00:00 bash
20067 pts/0 00:00:00 bash
So, dass ein Kind-Prozess in der bash.
Aus der Lektüre der man-pages zu bash, es ist offensichtlich, dass ein anderer Prozess erzeugt eine sub-shell,
aber es fakes $$, die sneeky.
Ist der Unterschied zwischen bash und ksh erwartet, oder lese ich die Symptome falsch?
Edit: zusätzliche Informationen:
Läuft strace -f
auf bash und ksh auf Linux zeigt, dass die bash Aufrufe clone
zweimal für die sample-Befehl (es nicht nennen fork
). Also bash sein könnte, die Verwendung von threads (ich habe versucht ltrace
aber es core dumped!).
KornShell fordert weder fork
, vfork
noch clone
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
ksh93 arbeitet ungewöhnlich schwer zu vermeiden Unterschalen. Ein Teil der Grund ist die Vermeidung von stdio und die umfangreiche Verwendung von sfio die es ermöglicht gelieferten, direkt zu kommunizieren. Ein weiterer Grund ist, ksh kann in der Theorie haben so viele gelieferten. Wenn gebaut mit
SHOPT_CMDLIB_DIR
alle cmdlib gelieferten sind im Lieferumfang enthalten und standardmäßig aktiviert. Ich kann nicht geben eine umfassende Liste von Orten, wo die Unterschalen werden vermieden, aber es ist in der Regel in Situationen, in denen nur die gelieferten verwendet werden, und wo es keine Umleitungen.out:
Weiteren ordentlichen Konsequenz: interne I/O-Behandlung einige Pufferung Probleme einfach Weg. Hier ein lustiges Beispiel von Lesen Zeilen mit
tee
undhead
gelieferten (versuchen Sie nicht, diese in jede andere shell).Ksh-Shell eine subshell könnte oder nicht, führt zu einem neuen Prozess. Ich weiß nicht, was die Bedingungen sind, aber die Schale wurde für optimale Leistung auf Systemen, bei denen
fork()
war teurer als es in der Regel auf Linux, so dass es vermeidet das erstellen eines neuen Prozess, Wann immer er kann. Die Spezifikation sagt, eine "neue Umwelt", sondern auch, dass ökologische Trennung kann erfolgen in-Prozess.Anderen vage-bezogene Unterschied ist die Verwendung der neuen Verfahren für die Rohre. In ksh und zsh, wenn der Letzte Befehl in einer pipeline ist ein builtin, läuft es in der aktuellen shell-Prozess, damit dies funktioniert:
In der bash, alle pipeline-Befehle nach dem ersten Lauf in Unterschalen, also die oben nicht funktioniert:
Als @dave-thompson-085 Punkte heraus, die Sie bekommen können der ksh/zsh Verhalten in der bash-Versionen 4.2 und neuere, wenn Sie schalten Sie die job-Kontrolle (
set +o monitor
) und schalten Sie daslastpipe
option (shopt -s lastpipe
). Aber meine übliche Lösung ist die Verwendung von Prozess-substitution statt:fork
?fork
verwendet werden, um eine sehr teure operation ist. Seit ksh ist open-source in diesen Tagen, ich würde nur Blick auf den code werfen, um zu sehen, wenn er beschließt, die Gabel. Alle Korn-Buch sagt, ist "Eine subshell ist eine separate Umgebung, die eine Kopie der Eltern-shell-Umgebung. ... Eine subshell Umwelt brauchen nicht einen separaten Prozess."shopt -s lastpipe
und jobcontrol ausgeschaltet ist (in der Regel impliziert nicht-interaktiven) und die pipeline ist nicht im hintergrund, es versuchen, laufen die letzten "gemeinsamen" in der aktuellen shell. unix.stackexchange.com/questions/143958/... gnu.org/software/bash/manual/html_node/...Die bash-manpage lautet:
Während dieser Satz ist über Rohre, es stark impliziert eine subshell ist ein separater Prozess.
Wikipedia-Begriffsklärung Seite beschreibt auch eine subshell in der Kind-Prozeß. Ein Kind-Prozess wird sicherlich selbst ein Prozess.
Den ksh-manpage (auf einen Blick) nicht direkt über seine eigene definition von einer subshell, also es bedeutet nicht, dass die eine oder andere Weise, dass eine subshell ist ein anderer Prozess.
Learning the Korn Shell sagt, dass Sie unterschiedliche Prozesse.
Ich würde sagen, du bist etwas fehlt (oder das Buch ist falsch oder veraltet ist).
ps
?strace
zeigen, dass die ksh nicht nennenfork
,vfork
oderclone
(auf Linux) für die Probe subshell.