Syntaxfrage zur ksh unter Solaris

Diskutiere Syntaxfrage zur ksh unter Solaris im Unix Derivate & sonst. Unix Fragen Forum im Bereich BSD / Unix; Hallo erstmal, dies ist mein erster Beitrag in diesem Forum und eines Vorweg: ich würde mich durchaus als Unixeinsteiger bezeichnen, daher möge...

  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. 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.
     
  3. #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...
     
  4. 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.
     
  5. #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?
     
  6. 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.
     
Thema:

Syntaxfrage zur ksh unter Solaris

Die Seite wird geladen...

Syntaxfrage zur ksh unter Solaris - Ähnliche Themen

  1. Anlage einer SWAP-Datei unter CentOS 7 funktioniert nicht

    Anlage einer SWAP-Datei unter CentOS 7 funktioniert nicht: Hallo zusammen, ich verwende einen vServer von Strato (Linux V30) mit CentOS 7 64bit. Hier wollte ich nun einen SWAP-Speicher mit 8GB anlegen -...
  2. Robots aussperren, Websitescan unterbinden, PHP Checkbox-Captcha?

    Robots aussperren, Websitescan unterbinden, PHP Checkbox-Captcha?: Hallo zusammen, ich hätte gerne einen bestimmten Bereich der Webseite, den Robots oder scriptbasierte Scans von irgendwelchen Suchmaschinen oder...
  3. [gelöst] 2.HDD unter Freebsd partitionieren

    [gelöst] 2.HDD unter Freebsd partitionieren: Hallo Habe eine Testserver mit freeBSD 11.0 auf einer IDE-HDD (ada0) mit ZFS-root hab jetzt eine 2. HDd (SATA) angeschlossen und wollte die...
  4. Installation von COM Ports unter Unix

    Installation von COM Ports unter Unix: Hallo, vorne weg, ich habe von Linux nur Grundkenntnisse und bitte daher etwas um Rücksicht, wenn ich doofe fragen stelle;). Zum Problem: Es gibt...
  5. Samba 4 trennt sich beim Übertragen unter Windows7/10

    Samba 4 trennt sich beim Übertragen unter Windows7/10: Hallo zusammen Mir ist nun schon ein paar Mal aufgefallen dass sich mein Samba-Server (Debian 8.7.1 + backports-Kernel v4.9.x) "einfach so", ohne...