
Hallo ihr lieben, habe eine kurze Frage. Wollte mich ein bisschen in die Kommandozeile & deren Programmierung reinarbeiten. Wie ist das denn nun mit den Scripts. Die kann man doch unter jedem beliebigen Texteditor (vim,emacs) schreiben. Woher weiß dann aber die bash, daß es sich um ein Script handelt zum ausführen, und nicht um eine Textdatei? Machts mal gut. Und schönen Sonntag noch. cu Sascha -- Greez Sascha LINUX User # 290422 (http://counter.li.org) "Er ist kein Trottel", sagt ein Freund des amerikanischen Präsidenten. "Aber er tendiert dazu, auf den oder die zu hören, mit dem oder der er gerade redet, solange es kein Thema ist, das er wirklich versteht oder zu dem er starke Gefühle hat." >Investors Daily<

Moin, * Sascha Manns wrote (2004-02-01 13:45):
habe eine kurze Frage. Wollte mich ein bisschen in die Kommandozeile & deren Programmierung reinarbeiten. Wie ist das denn nun mit den Scripts. Die kann man doch unter jedem beliebigen Texteditor (vim,emacs) schreiben.
Genau. Ich empfehle NEdit, aber sieh Dich mal um und nimm den, der Dir am besten gefällt.
Woher weiß dann aber die bash, daß es sich um ein Script handelt zum ausführen, und nicht um eine Textdatei?
Du setzt die Dateiattribute so, daß die Datei ausführbar ist, zB.: chmod u+x datei.sh Außerdem setzt Du als erste Zeile des Skripts den Interpreter: #! /bin/sh Thorsten -- Why do we drink cow's milk? Who was the first guy who first looked at a cow and said "I think I'll drink whatever comes out of these things when I squeeze 'em!"? - Calvin

Hallo Sascha, On Sun, Feb 01, 2004 at 01:45:20PM +0100, Sascha Manns wrote:
habe eine kurze Frage. Wollte mich ein bisschen in die Kommandozeile & deren Programmierung reinarbeiten. Wie ist das denn nun mit den Scripts. Die kann man doch unter jedem beliebigen Texteditor (vim,emacs) schreiben.
ja kann man. Auch wenn letzteres ein OS ist *duck*
Woher weiß dann aber die bash, daß es sich um ein Script handelt zum ausführen, und nicht um eine Textdatei?
an der ersten Zeile diese sollte #!/bin/bash enthalten oder eben den gewünschten Interpreter. Weiteres z.B. unter http://www.linuxfibel.de/bashprog.htm Greetings Daniel -- Was einen Anfang hat muss auch ein Ende haben

Sascha Manns wrote:
habe eine kurze Frage. Wollte mich ein bisschen in die Kommandozeile & deren Programmierung reinarbeiten. Wie ist das denn nun mit den Scripts. Die kann man doch unter jedem beliebigen Texteditor (vim,emacs) schreiben.
Genau. Graphisch (XEmacs, Nedit, usw.) oder an Konsole (vim, joe, usw.) spielt prinzipiell alles keine Rolle - nimm den Editor, mit dem Du am besten klar kommst.
Woher weiß dann aber die bash, daß es sich um ein Script handelt zum ausführen, und nicht um eine Textdatei?
Die Datei beginnt mit einer Zeile wie "#!/bin/bash" oder aehnlichem, das gibt den Interpreter an. Bei Perl-Skripten kann es z.B. "#!/usr/bin/perl -w" heissen. Dabei hat eben "#!" eine Sonderbedeutung, reine Kommentare waeren lediglich durch ein "#" gekennzeichnet. Zusaetzlich muss die Datei dann ausfuehrbar gemacht werden nach dem Fertigstellen, das geht mit "chmod", siehe "man chmod". Oder aber alternativ zu obigem kannst Du den Interpreter auch direkt an der Kommandozeile aufrufen und die Datei uebergeben, dann muss sie auch nicht ausfuehrbar sein. CU, Thomson

Hallo ihr lieben, Am Son, 2004-02-01 um 14.19 schrieb Thomas Hertweck:
Die Datei beginnt mit einer Zeile wie "#!/bin/bash" oder aehnlichem, das gibt den Interpreter an. Bei Perl-Skripten kann es z.B. "#!/usr/bin/perl -w" heissen. Dabei hat eben "#!" eine Sonderbedeutung, reine Kommentare waeren lediglich durch ein "#"
Vielen lieben dank euch allen. Das mit der ersten Zeile hatte ich eingebaut. Aber das sie ausführbar sein soll, vergaß ich. Vielen Dank :-) -- Greez Sascha LINUX User # 290422 (http://counter.li.org) "Er ist kein Trottel", sagt ein Freund des amerikanischen Präsidenten. "Aber er tendiert dazu, auf den oder die zu hören, mit dem oder der er gerade redet, solange es kein Thema ist, das er wirklich versteht oder zu dem er starke Gefühle hat." >Investors Daily<

Am Sonntag, 1. Februar 2004 14:19 schrieb Thomas Hertweck:
Sascha Manns wrote: [...]
Woher weiß dann aber die bash, daß es sich um ein Script handelt zum ausführen, und nicht um eine Textdatei?
Die Datei beginnt mit einer Zeile wie "#!/bin/bash" oder aehnlichem, das gibt den Interpreter an. Bei Perl-Skripten kann es z.B. "#!/usr/bin/perl -w" heissen. Dabei hat eben "#!" eine [...]
Für Shell-Scripts ist das nicht nötig. Das wird per Default angenommen, wenn Du ein Script ausführst. Jan

Jan Trippler wrote:
Am Sonntag, 1. Februar 2004 14:19 schrieb Thomas Hertweck:
[...] Die Datei beginnt mit einer Zeile wie "#!/bin/bash" oder aehnlichem, das gibt den Interpreter an. Bei Perl-Skripten kann es z.B. "#!/usr/bin/perl -w" heissen. Dabei hat eben "#!" eine
[...]
Für Shell-Scripts ist das nicht nötig. Das wird per Default angenommen, wenn Du ein Script ausführst.
Die Aussage verstehe ich nicht. Wenn ich ein Skript in ksh-Syntax oder in csh-Syntax schreibe, was soll da "per default bei Skripten" angenommen werden? Um herauszufinden, welcher Interpreter etwas mit der Datei anfangen kann, muesste ja dann die komplette Syntax analysiert werden. Es muss ein "#!/bin/interpreter" zu Beginn stehen, ansonsten wird es in diesem Falle schlicht nicht funktionieren, oder das Skript muss direkt mit Interpreter an der Kommandozeile aufgerufen werden. Umgekehrt wird es auch zu Problemen fuehren. Man mag es fuer die Default-Shell weglassen koennen, aber was haette das fuer Vorteile? Auf dem naechsten Rechner gibt es vielleicht eine andere Default-Shell... CU, Thomson

Am Sonntag, 1. Februar 2004 17:12 schrieb Thomas Hertweck:
Jan Trippler wrote:
Am Sonntag, 1. Februar 2004 14:19 schrieb Thomas Hertweck:
[...] Die Datei beginnt mit einer Zeile wie "#!/bin/bash" oder aehnlichem, das gibt den Interpreter an. Bei Perl-Skripten kann es z.B. "#!/usr/bin/perl -w" heissen. Dabei hat eben "#!" eine
[...]
Für Shell-Scripts ist das nicht nötig. Das wird per Default angenommen, wenn Du ein Script ausführst.
Die Aussage verstehe ich nicht. Wenn ich ein Skript in ksh-Syntax oder in csh-Syntax schreibe, was soll da "per default bei Skripten" angenommen werden?
Die Default-Shell? Probier mal folgendes: jan@roland:~> cat ls.txt ls | grep '\.' jan@roland:~> ls -l ls.txt -rwxr-xr-x 1 jan users 15 2004-02-01 19:48 ls.txt jan@roland:~> ./ls.txt OpenOffice.org all_mp3s.lst ls.txt mysqlaccess.log Und dann pack einfach mal z. B. Perl rein: jan@roland:~> cat ls.txt use warnings; print "Perl-Script\n"; jan@roland:~> ./ls.txt ./ls.txt: line 1: use: command not found ./ls.txt: line 2: print: command not found jan@roland:~> which sh /bin/sh Es zieht wohl in solchen Fällen /bin/sh. Und das liefert (Ausgabe gekürzt): jan@roland:~> ls -l /bin/sh lrwxrwxrwx 1 root root 4 2003-11-16 01:30 /bin/sh -> bash
Um herauszufinden, welcher Interpreter etwas mit der Datei anfangen kann, muesste ja dann die komplette Syntax analysiert werden.
Nein - es wird die Shell /bin/sh benutzt, wenn die nicht passt - Fehler.
Es muss ein "#!/bin/interpreter" zu Beginn stehen, ansonsten wird es in diesem Falle schlicht nicht funktionieren, oder das Skript muss direkt mit Interpreter an der Kommandozeile aufgerufen werden.
Nein, es _muss_ gar nicht. Siehe oben, probiers aus.
Umgekehrt wird es auch zu Problemen fuehren. Man mag es fuer die Default-Shell weglassen koennen, aber was haette das fuer Vorteile? Auf dem naechsten Rechner gibt es vielleicht eine andere Default-Shell...
Ich habe nicht gesagt, dass so ein Herangehen vorteilhaft ist. Ich habe nur klarstellen wollen, dass die *shebang*-Zeile kein _MUSS_ ist, solange der Default-Interpreter das Script verarbeiten kann. Jan

Jan Trippler wrote:
Am Sonntag, 1. Februar 2004 17:12 schrieb Thomas Hertweck:
[...] Die Aussage verstehe ich nicht. Wenn ich ein Skript in ksh-Syntax oder in csh-Syntax schreibe, was soll da "per default bei Skripten" angenommen werden?
Die Default-Shell? Probier mal folgendes: [...]
Ja, das ist schon klar. Aber was hilft das? Dann erfahre ich, dass das Skript nicht von der Default-Shell abgearbeitet werden kann. Ist ja nicht gerade das, was man moechte, wenn man ein Skript schreibt. Es soll ja dann auch funktionieren. Ergo: schreibe den korrekten Interpreter an den Beginn des Skriptes. Dann gehts auch, wenn die Syntax im Skript nicht zur Standard-Shell passt.
Es muss ein "#!/bin/interpreter" zu Beginn stehen, ansonsten wird es in diesem Falle schlicht nicht funktionieren, oder das Skript muss direkt mit Interpreter an der Kommandozeile aufgerufen werden.
Nein, es _muss_ gar nicht. Siehe oben, probiers aus.
Ja, Du hast Recht, solange das Skript wirklich fuer die Standard-Shell geschrieben ist und ich in dem Falle, dass ich die Syntax einer anderen Shell verwende, mich nicht an der Fehlermeldung stoere, die dann die Standard-Shell wirft. Lass es mich umformulieren: Es ist vorteilhaft, ein "#!/bin/interpreter" zu Beginn des Skriptes stehen zu haben :-)
[...] Ich habe nicht gesagt, dass so ein Herangehen vorteilhaft ist. Ich habe nur klarstellen wollen, dass die *shebang*-Zeile kein _MUSS_ ist, solange der Default-Interpreter das Script verarbeiten kann.
OK, ich verstehe jetzt, was Du meinst. Allerdings halte ich trotz allem wenig davon, die Zeile mit dem Interpreter wegzulassen :-) Gruesse, Thomson

Am Sonntag, 1. Februar 2004 20:20 schrieb Thomas Hertweck:
Jan Trippler wrote: [...]
Ich habe nicht gesagt, dass so ein Herangehen vorteilhaft ist. Ich habe nur klarstellen wollen, dass die *shebang*-Zeile kein _MUSS_ ist, solange der Default-Interpreter das Script verarbeiten kann.
OK, ich verstehe jetzt, was Du meinst. Allerdings halte ich trotz allem wenig davon, die Zeile mit dem Interpreter wegzulassen :-)
Ich auch, aber ich sehe sowas ständig - vor allem auf Unix-Systemen, bei denen nicht so eine große Auswahl an Shells besteht. Wenn es nur Bourne- und Korn-Shell gibt und die Korn-Shell der Default ist, dann stellt der Sysadmin keine Fragen mehr ;-) Das funktioniert auch in den crontab-Jobs, also wird kein Gedanke mehr dran verwendet. Jan

Moin, * Jan Trippler wrote (2004-02-01 20:05):
Es zieht wohl in solchen Fällen /bin/sh.
Nein, es "zieht" die aktuelle Shell. Von der Du nicht weiß, welche es ist, wenn Du das Skript schreibst. Geht es Dir darum, eine Zeile zu sparen? Ist Deine Festplatte so klein? Bei so einer Sache denke ich doch garnicht nach. Shebang rein, Thema erledigt. Thorsten -- Man will occasionally stumble over the truth, but most of the time he will pick himself up and continue on. - Winston Churchill

*** Jan Trippler <Jan.Trippler@t-online.de> wrote:
Am Sonntag, 1. Februar 2004 17:12 schrieb Thomas Hertweck:
Für Shell-Scripts ist das nicht nötig. Das wird per Default angenommen, wenn Du ein Script ausführst.
Die Aussage verstehe ich nicht. Wenn ich ein Skript in ksh-Syntax oder in csh-Syntax schreibe, was soll da "per default bei Skripten" angenommen werden?
Die Default-Shell? Probier mal folgendes:
jan@roland:~> cat ls.txt ls | grep '\.' jan@roland:~> ls -l ls.txt -rwxr-xr-x 1 jan users 15 2004-02-01 19:48 ls.txt jan@roland:~> ./ls.txt OpenOffice.org all_mp3s.lst ls.txt mysqlaccess.log
Und dann pack einfach mal z. B. Perl rein: jan@roland:~> cat ls.txt use warnings; print "Perl-Script\n"; jan@roland:~> ./ls.txt ./ls.txt: line 1: use: command not found ./ls.txt: line 2: print: command not found jan@roland:~> which sh /bin/sh
Es zieht wohl in solchen Fällen /bin/sh. Und das liefert (Ausgabe
versuche das mal in z.b. der bash mit z.b. sleep 600 in ls.txt und schaue dir dann die PPID des prozesses an. dann das ganze nochmal in z.b. der ksh und dann nochmal die PPID des prozesses ansehen. micha
participants (6)
-
Daniel Lord
-
Jan.Trippler@t-online.de
-
Michael Meyer
-
Sascha Manns
-
Thomas Hertweck
-
Thorsten Haude