Karl Heinz: Script in Linux versus Batch in Windows

Hallo,

auf der Seite

https://wiki.ubuntuusers.de/Skripte/

steht u.a. folgender Satz:

Hier sind einige kurze Code-Schnipsel, die sich leicht in eigenen Skripten verwenden lassen. Sie sind in verschiedenen Sprachen geschrieben, darunter Bash, Ruby, Python und Perl oder awk.

Das sind damit vorgefertigte Code-Schnipsel in allen nur erdenklichen Programmiersprachen, die in einem Shell-Script verwendet werden können.

Ich verstehe nicht wie ein Shell Script alle Programmiersprachen auf einmal beherrschen kann? Wenn ich also ein Shell-Script schreibe kann ich mir aussuchen ob ich Java, C, C++, Assembler oder einer der oben genannten Sprachen verwende?

Ich dachte immer ich kann in einem Script nur eine dafür vorgesehene Scriptsprache verwenden und nicht sämtliche Programmiersprachen?

Wenn ich das auf Batch-Dateien in Windows übertrage würde das ja bedeuten da ich diese auch in der Programmiersprache meiner Wahl erstellen kann? Ist das so?

Bei Windows geht das aber meines Erachtens nicht, deshalb die Frage, wie die Programmiersprache heißt mit der man Batch-Dateien in Windows erstellt?

akzeptierte Antworten

  1. Mahlzeit,

    https://wiki.ubuntuusers.de/Skripte/

    Hier sind einige kurze Code-Schnipsel, die sich leicht in eigenen Skripten verwenden lassen. Sie sind in verschiedenen Sprachen geschrieben, darunter Bash, Ruby, Python und Perl oder awk.

    Das sind damit vorgefertigte Code-Schnipsel in allen nur erdenklichen Programmiersprachen, die in einem Shell-Script verwendet werden können.

    Ich verstehe nicht wie ein Shell Script alle Programmiersprachen auf einmal beherrschen kann?

    da gibt es zwei Möglichkeiten.

    1. Der Trivialfall: Man schreibt das Script, und ruft es dann auf, indem man den Namen des dafür zuständigen Interpreters davorsetzt. So wird es beispielsweise bei PHP gemacht. Der Aufruf erfolgt dann von der Kommandozeile mit
      php sample-script.php
      Da ist also keinerlei Magie dabei, das Prinzip ist dasselbe wie man es auch in Windows kennt.

    2. Mit Trick 17 und doppeltem Boden: Wenn du dir mal einige der Beispielscripte anschaust, wirst du feststellen, dass viele in der ersten Zeile etwas in der Art stehen haben:
      #!/usr/bin/env python
      Das ist die sogenannte Shebang-Zeile, an der die Shell (meistens bash) erkennt, welcher Interpreter für dieses Script zuständig ist, und tut dann das, was ich unter 1. beschrieben habe, automatisch.

    Wenn ich also ein Shell-Script schreibe kann ich mir aussuchen ob ich Java, C, C++, Assembler oder einer der oben genannten Sprachen verwendet?

    Naja, fast. So richtig funktioniert das nur mit Scriptsprachen - also Sprachen, die direkt interpretiert und ausgeführt werden. Was du eben genannt hast, sind aber üblicherweise Compilersprachen. Das heißt, ein Quellcode in C/C++ oder Java muss normalerweise erst in ein ausführbares Programm übersetzt ("compiliert") werden, das dann seinerseits wieder direkt von der Kommandozeile aus aufgerufen werden kann. Das ist dann ein "echtes" Programm, kein Script mehr.

    Ich dachte immer ich kann in einem Script nur eine dafür vorgesehene Scriptsprache verwenden und nicht sämtliche Programmiersprachen.

    Ja, ist auch so. Mehr oder weniger. ;-)

    Bei Windows geht das aber meines Erachtens nicht

    Doch, nur das Konzept ist anders. Windows erkennt die verschiedenen Dateitypen primär an der Endung des Dateinamens. Es ist nun kein Hexenwerk, Windows beizubringen, dass Dateien mit der Endung ".php" grundsätzlich mit dem PHP-Interpreter php.exe geöffnet werden. Dann kann man sie entweder direkt aus dem Windows-Explorer per Doppelklick starten, oder von der Kommandozeile aus mit dem "Zauberwort" start, also etwa:
    start myscript.php

    So long,
     Martin

    1. Tach,

      Naja, fast. So richtig funktioniert das nur mit Scriptsprachen - also Sprachen, die direkt interpretiert und ausgeführt werden. Was du eben genannt hast, sind aber üblicherweise Compilersprachen. Das heißt, ein Quellcode in C/C++ oder Java muss normalerweise erst in ein ausführbares Programm übersetzt ("compiliert") werden, das dann seinerseits wieder direkt von der Kommandozeile aus aufgerufen werden kann. Das ist dann ein "echtes" Programm, kein Script mehr.

      aber, wenn einem langweilig ist, kann man das auch die Shell erledigen lassen:

      #!/bin/bash
      sed -n -e '7,$p' < "$0" | /usr/bin/gcc -x c -o "$0.$$.out" -
      $0.$$.out "$0" "$@"
      STATUS=$?
      rm $0.$$.out
      exit $STATUS
      #include <stdio.h>
      
      int main(int argc, char **argv)
      {
        int i;
        for (i = 0; i < argc; i++)
          printf("argv[%d] -> %s\n", i, argv[i]);
        return 0;
      }
      

      aus Multiline Shebang

      mfg
      Woodfighter

    2. Hallo Martin,

      nachfolgend noch einige Fragen bzw. Mutmaßungen mit Bitte um Beantwortung, Bestätigung bzw. Berichtigung:

      Zunächst muss man zwischen Batch-Skripten (Windows) und Shell-Skripten (Linux) unterscheiden.

      Die Shell-Skripte (Linux) können entweder in der Skriptsprache, die vom Kommandozeileninterpreter abgeleitet wurde, oder in einer Skriptsprache (Lisp, Python, Perl), die mit dem Kommandozeileninterpreter nichts zu tun haben, verfasst werden.

      Die meisten Shell-Skripte (Linux) als auch-Batch-Skripte (Windows) werden in der Programmiersprache verfasst die vom Kommandozeileninterpreter abgeleitet wurde.

      Shell-Skripte (Linux) werden gelegentlich auch in Sprachen (Lisp, Python, Perl) verfasst die vom Kommandozeileninterpreter unabhängig sind.

      Batch-Skripte (Windows) kenne ich eigentlich nur in der Sprache die vom Kommandozeileninterpreter abgeleitet ist. Batch-Skripte in Sprachen die vom Kommandozeileninterpreter unabhängig sind habe ich in der Praxis bisher nie gesehen. Werden diese Sprachen in Windows überhaupt zur Batch-Programmierung eingesetzt?

      Verwendet man für ein Batch-Skript (Windows) oder ein Shell-Skript (Linux) die Programmiersprache die vom Kommandozeileninterpreter abgeleitet wurde, so ist es nicht notwendig die Datei ausführbar zu machen (Shebang Zeile bei Linux), da der Kommandozeileninterpreter alle im Skript verwendeten Befehle kennt.

      Während es in Windows nur einen Kommandozeileninterpreter gibt hat jede Shell in Linux Ihren eigenen Kommandozeileninterpreter.

      Welche Skriptsprache sollte man für Shell-Skripte (Linux) verwenden, die vom Kommandozeileninterpreter abgeleitete oder eine vom Kommandozeileninterpreter unabhängige Sprache (Lisp, Perl, Python)?

      Skriptsprachen (Lisp, Perl, Python) und Programmiersprachen (Java, C, C++) haben ja einen Namen. Wie aber ist das mit den Programmiersprachen, die von den Kommandozeileninterpreter abgeleitet sind. Haben diese Skriptsprachen eigentlich keine Namen? Wie nennt sich die Sprache mit deren Hilfe ich ein Batch-Skript (Windows) programmiere bzw. wie nennt sich die Sprache (die vom Kommandozeileninterpreter abgeleitet ist) mit deren Hilfe ich ein Shell-Skript (Linux) programmiere?

      1. Hallo,

        Zunächst muss man zwischen Batch-Skripten (Windows) und Shell-Skripten (Linux) unterscheiden.

        nur in der Detailbetrachtung; im Grunde ist beides dasselbe: Eine Textdatei enthält eine Folge von Anweisungen, die von irgendeinem Interpreter (entweder dem Shell-internen oder einem anderen) der Reihe nach abgearbeitet werden.

        Die Shell-Skripte (Linux) können entweder in der Skriptsprache, die vom Kommandozeileninterpreter abgeleitet wurde, oder in einer Skriptsprache (Lisp, Python, Perl), die mit dem Kommandozeileninterpreter nichts zu tun haben, verfasst werden.

        Ja. Wobei im zweiten Fall die schon erwähnte Shebang-Zeile notwendig ist, damit die Shell erkennt, "wer" dafür zuständig ist, während diese Zeile bei reinen Shell-Scripten nicht unbedingt nötig ist.

        Batch-Skripte (Windows) kenne ich eigentlich nur in der Sprache die vom Kommandozeileninterpreter abgeleitet ist. Batch-Skripte in Sprachen die vom Kommandozeileninterpreter unabhängig sind habe ich in der Praxis bisher nie gesehen. Werden diese Sprachen in Windows überhaupt zur Batch-Programmierung eingesetzt?

        Kaum. Das ist in der Windows-Welt sehr ungewöhnlich. Das hängt wohl unter anderem damit zusammen, dass Windows sich sehr viel stärker sld Linux an Laien-Anwender richtet. Die wollen in der Regel eine hübsch bunte GUI-Lösung zum Klicken. Die Kommandozeile nutzen nur wenige Windows-Anwender wirklich.

        Verwendet man für ein Batch-Skript (Windows) oder ein Shell-Skript (Linux) die Programmiersprache die vom Kommandozeileninterpreter abgeleitet wurde, so ist es nicht notwendig die Datei ausführbar zu machen (Shebang Zeile bei Linux), da der Kommandozeileninterpreter alle im Skript verwendeten Befehle kennt.

        Oh doch, sie muss in jedem Fall als ausführbar gekennzeichnet sein (das x-Flag in den Berechtigungen muss gesetzt sein), wenn man sie einfach so durch Eingabe des Namens aufrufen möchte.

        Während es in Windows nur einen Kommandozeileninterpreter gibt ...

        Das stimmt so nicht ganz. Frühere Windows-Versionen hatten als Erbe aus der DOS-Ära noch command.com als Shell, die NT-basierten Systeme (im Consumer-Bereich ab Windows XP) haben cmd.exe, die gegenüber command.com deutlich weiterentwickelt ist; und ab Windows 7 (?) steht als Alternative noch die Powershell zur Verfügung.

        ... hat jede Shell in Linux Ihren eigenen Kommandozeileninterpreter.

        Ja, aber die sind einander recht ähnlich.

        Welche Skriptsprache sollte man für Shell-Skripte (Linux) verwenden, die vom Kommandozeileninterpreter abgeleitete oder eine vom Kommandozeileninterpreter unabhängige Sprache (Lisp, Perl, Python)?

        Das kommt sehr auf die gewünschte Anwendung an.

        Skriptsprachen (Lisp, Perl, Python) und Programmiersprachen (Java, C, C++) haben ja einen Namen. Wie aber ist das mit den Programmiersprachen, die von den Kommandozeileninterpreter abgeleitet sind.

        Die werden üblicherweise nicht als Programmiersprachen bezeichnet.

        Haben diese Skriptsprachen eigentlich keine Namen?

        Nicht wirklich. In Linux werden sie für gewöhnlich genauso genannt wie die Shell, mit der sie ausgeführt werden (bei den heutigen Linuxen meistens bash); in Windows ist der Begriff Batch sowohl für die Scriptdatei, als auch für die Sprache geläufig, auch wenn das nicht wirklich korrekt ist. Einen offiziellen Namen für diese Scriptsprachen gibt es meines Wissens nicht.

        So long,
         Martin

        1. Hallo

          Während es in Windows nur einen Kommandozeileninterpreter gibt ...

          Das stimmt so nicht ganz. Frühere Windows-Versionen hatten als Erbe aus der DOS-Ära noch command.com als Shell, die NT-basierten Systeme (im Consumer-Bereich ab Windows XP) haben cmd.exe, die gegenüber command.com deutlich weiterentwickelt ist; und ab Windows 7 (?) steht als Alternative noch die Powershell zur Verfügung.

          Zur Konkretisierung: Die Windows Powershell wird laut Wikipedia seit Windows 7 bzw. Windows Server 2008 vorinstalliert. Die Versionen 1 und 2 der Powershell sind aber auch für ältere Windows-Versionen (ab XP bzw. Server 2003) verfügbar.

          Haben diese Skriptsprachen eigentlich keine Namen?

          … in Windows ist der Begriff Batch sowohl für die Scriptdatei, als auch für die Sprache geläufig, auch wenn das nicht wirklich korrekt ist. Einen offiziellen Namen für diese Scriptsprachen gibt es meines Wissens nicht.

          Ich kenne das auch als „Batch“ oder „Batch-Skript“. Mir war so, dass die Batch-Skripte normalerweise™ in einem Basic-Dialekt geschrieben werden.

          Tschö, Auge

          --
          Es schimmerte ein Licht am Ende des Tunnels und es stammte von einem Flammenwerfer.
          Terry Pratchett, „Gevatter Tod“
        2. Tach,

          ... hat jede Shell in Linux Ihren eigenen Kommandozeileninterpreter.

          Ja, aber die sind einander recht ähnlich.

          ich würde sagen, tcsh und bash sind sich etwa so ähnlich wie Java und Javascript und wenn ich bei Kollegen am Rechner eine zsh erwische, die zwar bash-kompatibel ist, fluche ich auch noch regelmäßig.

          Skriptsprachen (Lisp, Perl, Python) und Programmiersprachen (Java, C, C++) haben ja einen Namen. Wie aber ist das mit den Programmiersprachen, die von den Kommandozeileninterpreter abgeleitet sind.

          Die werden üblicherweise nicht als Programmiersprachen bezeichnet.

          Warum sollte ich bash keine Programmiersprache nennen, ist genauso Turing-vollständig wie die anderen genannten auch. bash ist genauso eine Scriptsprache wie Python; genaugenommen gibt es keine festen Trennungen mehr: Ist Python eine Compilersprache oder nicht? Ist Java, wenn ich es in BeanShell aufrufe eine Scriptsprache? …

          mfg
          Woodfighter

          1. Hallo,

            ... hat jede Shell in Linux Ihren eigenen Kommandozeileninterpreter.

            Ja, aber die sind einander recht ähnlich.

            ich würde sagen, tcsh und bash sind sich etwa so ähnlich wie Java und Javascript und wenn ich bei Kollegen am Rechner eine zsh erwische, die zwar bash-kompatibel ist, fluche ich auch noch regelmäßig.

            tcsh und zsh kenne ich nicht einmal dem Namen nach, sind das eher weniger prominente Vertreter?

            Anyway, wie stark verschiedene Shells im persönlichen Eindruck differieren, hängt ja sehr davon ab, wie intensiv man "ins Eingemachte" greift. Ich bin vom Gros der Anwender ausgegangen, die die Shell vor allem für einfache Programmaufrufe verwenden, hier und da mal garniert mit einer Pipe oder einer Umleitung von stdin oder stdout.

            Warum sollte ich bash keine Programmiersprache nennen, ist genauso Turing-vollständig wie die anderen genannten auch.

            Tatsächlich? Möglicherweise ist mein Wissen Stückwerk, da auch ich mich zu der großen Gruppe zähle, die ich im vorhergehenden Absatz beschrieben habe.

            bash ist genauso eine Scriptsprache wie Python; genaugenommen gibt es keine festen Trennungen mehr: Ist Python eine Compilersprache oder nicht?

            Meines Wissens nicht, aber ich habe Python noch nie verwendet.

            Ist Java, wenn ich es in BeanShell aufrufe eine Scriptsprache? …

            Keine Ahnung - wer oder was ist BeanShell?

            Ciao,
             Martin

            1. Tach,

              tcsh und zsh kenne ich nicht einmal dem Namen nach, sind das eher weniger prominente Vertreter?

              weniger als bash auf alle Fälle, tcsh ist die Default-Shell von freebsd, IIRC; zsh ist offensichtlich populär genug, dass ich mir einen Kollegen damit eingefangen habe, der dann noch jemanden angesteckt hat ;-)

              Anyway, wie stark verschiedene Shells im persönlichen Eindruck differieren, hängt ja sehr davon ab, wie intensiv man "ins Eingemachte" greift. Ich bin vom Gros der Anwender ausgegangen, die die Shell vor allem für einfache Programmaufrufe verwenden, hier und da mal garniert mit einer Pipe oder einer Umleitung von stdin oder stdout.

              Letzteres ist in tcsh schon anders als in bash und auch andere Dinge sind relativ früh auffällig.

              Warum sollte ich bash keine Programmiersprache nennen, ist genauso Turing-vollständig wie die anderen genannten auch.

              Tatsächlich?

              Da Turing-Vollständigkeit nichts wirklich schwieriges ist, ist es meist eher schwer Sprachen zu finden, die es nicht sind (HTML und CSS sind es wohl)

              bash ist genauso eine Scriptsprache wie Python; genaugenommen gibt es keine festen Trennungen mehr: Ist Python eine Compilersprache oder nicht?

              Meines Wissens nicht, aber ich habe Python noch nie verwendet.

              Jedes Python-Script wir JIT kompiliert, diese Kompilate werden i.A. auch gespeichert, aber das ist dann kein Assembler sondern Bytecode ähnlich wie in Java.

              Ist Java, wenn ich es in BeanShell aufrufe eine Scriptsprache? …

              Keine Ahnung - wer oder was ist BeanShell?

              Sowas wie ein Kommandozeileninterface für Java.

              mfg
              Woodfighter

              1. Hallo woodfighter,

                tcsh und zsh kenne ich nicht einmal dem Namen nach, sind das eher weniger prominente Vertreter?

                weniger als bash auf alle Fälle, tcsh ist die Default-Shell von freebsd, IIRC; zsh ist offensichtlich populär genug, dass ich mir einen Kollegen damit eingefangen habe, der dann noch jemanden angesteckt hat ;-)

                Ich verwende jetzt seit 3 Jahren zsh und bin sehr zufrieden.

                Jedes Python-Script wir JIT kompiliert, diese Kompilate werden i.A. auch gespeichert, aber das ist dann kein Assembler sondern Bytecode ähnlich wie in Java.

                Jetzt wirfst du Sachen durcheinander.

                Der Python-Bytecode ist im wesentlichen „nur“ der serialisierte AST, der aus Caching-Gründen auf der Platte abgelegt wird. Das hat mit JIT nichts zu tun; CPython (die Referenz-Implementation von Python und das, was man allgemeinhin meint, wenn man von Python spricht) macht kein JIT.

                JIT meint das On-the-fly-übersetzen von Code (der dann bei Python in Form von ASTs vorliegt) in Maschinencode, aus Performance-Gründen. Das macht man z.B. bei Schleifen von denen absehbar ist, dass sie mehrfach ausgeführt werden, weil sich da dann der Aufwand lohnt. Erst PyPy hat JIT.

                Ist Java, wenn ich es in BeanShell aufrufe eine Scriptsprache? …

                Keine Ahnung - wer oder was ist BeanShell?

                Sowas wie ein Kommandozeileninterface für Java.

                Siehe auch

                LG,
                CK

                1. Tach,

                  Ich verwende jetzt seit 3 Jahren zsh und bin sehr zufrieden.

                  jo, ist auf meiner Liste, der Dinge, die ich mir mal ansehen muss, wenn mir langweilig ist

                  Der Python-Bytecode ist im wesentlichen „nur“ der serialisierte AST, der aus Caching-Gründen auf der Platte abgelegt wird. Das hat mit JIT nichts zu tun; CPython (die Referenz-Implementation von Python und das, was man allgemeinhin meint, wenn man von Python spricht) macht kein JIT.

                  Oh, danke; das kommt davon, wenn man über Dinge spricht, mit denen man sich nur halb auskennt.

                  mfg
                  Woodfighter