Syntaxfrage zur ksh unter Solaris

Dieses Thema im Forum "Unix Derivate & sonst. Unix Fragen" wurde erstellt von Shark2150, 09.03.2007.

  1. #1 Shark2150, 09.03.2007
    Shark2150

    Shark2150 Grünschnabel

    Dabei seit:
    09.03.2007
    Beiträge:
    3
    Zustimmungen:
    0
    Hallo erstmal,

    dies ist mein erster Beitrag in diesem Forum und eines Vorweg: ich würde mich durchaus als Unixeinsteiger bezeichnen, daher möge man mir bitte meine Unwissenheit verzeihen :)

    Ich besuche eine Vorlesung über UNIX (Solaris im speziellen) und auf einem Übungsblatt eine Frage die ich nicht so recht beantworten kann. Ich soll sagen was das Kommando (in der ksh):

    "{ cd /bin; ls; cd /etc; ls } | wc -l; pwd"

    ausgibt und ich soll erklären warum. Nun hab ich es einfach mal ausprobiert und gemerkt, das wc -l die Zeilen zählt, die durch die in {}-Klammern ausgeführten Befehle hervorgerufen werden und dass das folgende "pwd" das Directory ausgibt aus welchem der Befehl aufgerufen wurde. Also ist es so als wären die Kommandos in den Klammern nie ausgeführt worden - da man sich ja immer noch im selben Verzeichnis befindet. Auf der Suche nach dem Sinn der {}-Klammern habe ich ein Buch zu Rate gezogen, dass mir folgendes sagt:

    (cmd;cmd) Run cmd;cmd in a subshell.
    {cmd;cmd} Like (cmd;cmd) without a subshell.

    Heißt das nicht, dass die Kommandos ganz normal, also in der selben Shell ausgeführt werden müßten? Bin irgendwie ein wenig verwirrt :hilfe2: und wäre über eine Antwort dankbar,

    Shark2150
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. hades

    hades SUN-User

    Dabei seit:
    10.02.2007
    Beiträge:
    206
    Zustimmungen:
    0
    Ort:
    Biberach an der Riß
    Normalerweise ruft ein Shellkommando eine neue Shell (Subshell) auf, die den Befehl ausfuehrt und danach wieder beendet wird.
    Soll nun etwa aber eine Umgebungsvariable oder aehnliches gesetzt werden, dann kann man das nicht mit dieser Methode machen, weil damit nach Beenden der Subshell diese Umgebungsvariablen wieder verloren gingen. Hier wird sogenanntes "sourcing" benutzt, damit kann der Process in der eigentlichen Shell ohne eine Subshell ausgefuehrt werden.
     
  4. #3 Shark2150, 09.03.2007
    Shark2150

    Shark2150 Grünschnabel

    Dabei seit:
    09.03.2007
    Beiträge:
    3
    Zustimmungen:
    0
    Danke für die schnelle Antwort,

    allerdings habe ich sie nicht ganz verstanden ?(
    Mit normalerweise meinst du "normale" ()-Klammern, oder? Und wenn die {}-Klammern den Prozess ohne Subshell abwickelbar machen, warum werden dann nicht die Verzeichnisse korrekt gewechselt? Die Auswirkung ist ja mehr so etwas wie "so tun als ob", er führt sie insofern aus, dass wc die Zeilen zählen kann, aber wirkliche Verzeichniswechsel finden irgendwie nicht statt...
     
  5. hades

    hades SUN-User

    Dabei seit:
    10.02.2007
    Beiträge:
    206
    Zustimmungen:
    0
    Ort:
    Biberach an der Riß
    Nein, generell werden alle Kommandos in einer Subshell ausgefuert. Eine Ausnahme ist, wenn das Kommando mit einem vorangestellen . (Punkt) gesourced wird. Dann wird das Programm nicht in einer Subshell ausgefuehrt und Umgebungsvariablen stehen auch nach Terminierung des Processes weiterhin zur Verfuegung.

    In diesem Fall werden keine runden Klammern benutzt, damit das Ergebnis aller 4 Processe beim Tunneln ( | ) noch zur Verfuegung steht. Ein Verzeichniswechsel ist nicht vorgesehen.
     
  6. #5 Shark2150, 09.03.2007
    Shark2150

    Shark2150 Grünschnabel

    Dabei seit:
    09.03.2007
    Beiträge:
    3
    Zustimmungen:
    0
    Mhmmm, also wenn ich folgendes eingebe (Ich bin gerade im /bin Verzeichnis):

    { cd /etc ; ls -l } | wc -l

    dann zählt er die Zeilen, gibt die Anzahl aus und ich befinde mich nach wie vor im /bin Verzeichnis. Gebe ich aber folgendes ein:

    cd /etc ; ls -l | wc -l

    gibt er die gezählten Zeilen genau wie vorher aus, ich befinde mich anschließend aber im /etc Verzeichnis. Wieso beeinflussen die {}-Klammern den Verzeichniswechsel, wenn der Befehl darin ausgeführt wird?
     
  7. hades

    hades SUN-User

    Dabei seit:
    10.02.2007
    Beiträge:
    206
    Zustimmungen:
    0
    Ort:
    Biberach an der Riß
    Ich hoffe ich erklaere das jetzt nicht falsch, falls doch moege man mich bitte berichtigen!

    Durch die Klammern fuehrt die Shell (hier ohne Subshell) den Codeblock ( == Inhalt der Klammern) aus und gibt aber nur das Ergebnis als sogenannte "local variable" zurueck.

    In diesem Fall wird zwar auch der Wert von ls ausgegeben, allerdings interpretiert die Shell das nicht als Codeblock sondern fuehrt die Befehle der Reihe nach aus, was hier das gleiche Ergebnis auf der Standardausgabe liefert, allerdings eben mit Verzeichniswechsel.
     
  8. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
Thema:

Syntaxfrage zur ksh unter Solaris

Die Seite wird geladen...

Syntaxfrage zur ksh unter Solaris - Ähnliche Themen

  1. Update auf Apache >=2.4.12 unter Debian Jessie

    Update auf Apache >=2.4.12 unter Debian Jessie: Hi, aufgrund eines Bugs in Apache 2.4 benötige ich zum Deployment von Seafile unter Debian Jessie das Paket apache2 in der Version >= 2.4.12...
  2. Was mache ich falsch? Tiniywm und Mate Install unter OpenBSD

    Was mache ich falsch? Tiniywm und Mate Install unter OpenBSD: Hallo, # make tiny make: don't know how to make tiny Stop in /root/Downloads/tiny/tinywm-1.3 # make tinywm cc -O2 -pipe -o tinywm tinywm.c...
  3. Samba unter Windows 10

    Samba unter Windows 10: Hallo zusammen, ich habe auf meinen Ubuntu Server Samba installiert und eingerichtet. ich kann mich bei Windows 10 mit den Daten anmelden und...
  4. Netzwerkaufbau mit simulierten Paketen unter Linux

    Netzwerkaufbau mit simulierten Paketen unter Linux: Hallo, ich habe folgendes Problem. Da ich noch sehr unerfahren in Sachen Linux bzw. Netzwerkaufbau bin, wollte ich fragen, ob Ihr mir vllt etwas...
  5. Akonadi unterstützt Microsoft EWS

    Akonadi unterstützt Microsoft EWS: Krzysztof Nowicki hat eine initiale Unterstützung von Microsoft Exchange Web Services (EWS) für den KDE-Datenverwaltungsdienst »Akonadi«...