* Norbert Kordts schrieb am 08.Aug.2000:
Mir scheint, Marco hält entsprechend Deiner o. a. Syntaxdefinition
"cp /cdrom/* ." für das Kommando anstelle von "cp".
Er setzt setzt dann die Option " -R" syntaxgerecht dahinter. Weiteres Nachdenken über "argumente" erscheint dann verzichtbar, die sind in diesem Zusammenhang vordergründig überflüssig...
Ok, dann noch mal ganz langsam für Marco und alle anderen DOS-Umsteiger. Ein Befehl geht immer nur bis zum nächsten Blank, es sei denn, der Blank ist maskiert. Aber ein Befehl, der ein Blank im Namen hat ist mir nicht bekannt und sollte es auch nicht geben, also kann man, wenn man patheologisch Fälle außer Acht läßt, beruhigt sagen, daß ein Befehl immer nur das erste Wort ist. Worttrenner ist ein Blank oder Tab. Alles was danach kommt sind Argumente. Abgesehen von wenigen shellinterne Befehle wie cd, shift, pwd, help, if, do, true, .... usw. sind alle anderen Befehle entweder Aliases oder in einem profile definierte Funktionen oder aber ausführbare Dateien. Letzteres kommt wohl am meisten vor. So ist mit cp die Datei /bin/cp gemeint. [1] Es handelt sich hierbei um ein übersetztes C-Programm. Es gibt aber auch viele ausführbare Shellskripte. Wenn man cp -R /cdrom/* . eingibt, so wird als erstes die Shell, in der man sich befindet, den * ersetzen, und zwar mit sämtlichen Dateinamen, die nicht mit einem . anfangen und sich unmittelbar unter /cdrom befinden. Angenommen in /cdrom liegen die Dateien: .versteckt datei1 datei2 datei3 und die Verzeichnisse: verz1 verz2 o ersetzt die shell [2] den obigen Befehl cp -R /cdrom/* . durch cp -R /cdrom/datei1 /cdrom/datei2 /cdrom/datei3 /cdrom/verz1 /cdrom/verz2 . Das alles bekommt die ausführbare Datei /bin/cp zugewiesen. Als nulltes Argument das cp selber [3], als erstes Argument das -R, als zweites Argument das /cdrom/datei1, als drittes Argument das /cdrom/datei2 usw. bis schließlich als sechstes Argument /cdrom/verz2 und als siebtes und letztes Argument den . Diese Argumente hat das Programm, so nennt man ausführbare Dateien, /bin/cp zu bearbeiten. Wichtig an dieser Stelle ist, daß das Programm nicht mitbekommt, daß Du /cdrom/* gesagt hast. Für das Programm ist es nicht unterscheidbar, ob Du es als cp -R /cdrom/* . oder als cp -R /cdrom/datei1 /cdrom/datei2 /cdrom/datei3 /cdrom/verz1 /cdrom/verz2 . aufgerufen hast. Den Inhalt von /cdrom so wie oben angegeben vorausgesetzt natürlich. Und auch noch den Hinweiß, daß die Shell nicht auch /cdrom/.versteckt dabei hat, da .versteckt mit einem . beginnt und das nicht durch den * abgedeckt wird. Aber nur am Anfang. datei.1 würde schon abgedeckt. Diese Zeile wird nun von /bin/cp bearbeitet. Es ist eine unter UNIX/Linux übliche Konvention, daß Optionen mit - anfangen. [4] Da hält auch cp sich dran. Es werden alle Argumente am Anfang die mit einem - beginnen als Optionen betrachtet. Das ist zuende, wenn ein Argument nicht mit einem - beginnt, oder wenn ein Argument -- lautet. Alle weiteren Argumente sind die eigentlichen Argumente. [5] Bei cp bedeutet das, wenn es mehr als zwei eigentliche Argumente gibt, oder auch immer wenn es die Option -R (oder auch einige anderen) gibt, daß alle eigentliche Argumente bis auf das letzte als Dateinamen der zu kopierenden Dateien interpretiert wird. Für cp gibt es in unserem Fall sechs eigentliche Argumente, daß Du nur zwei angegeben hast, bekommt cp nicht mit. Wäre bei -R aber auch egal. Jedenfalls ist das letzte Argument das Verzeichnis, nach dem kopiert wird. [6] Hier ist es der . und der steht für das aktuelle Verzeichnis. [7] Es wird somit /cdrom/datei1 nach datei1 im aktuellen Verzeichnis kopiert, sowei /cdrom/datei2 nach datei2 und /cdrom/datei3 nach datei3 und auserdem /cdrom/verz1 nach verz1 und weil die Option -R angegeben ist, wird auch alle Unterverzeichnisse und deren Inhalte von /cdrom/verz1 genauso nach verz1 kopiert. Das Gleiche gilt für verz2. So sollte es ja wohl auch sein. Wenn Du aber cp /cdrom/* . -R eingibst, so interpretiert auch hier als erstes die shell wieder den *, und gibt folgendes an /bin/cp weiter: cp /cdrom/datei1 /cdrom/datei2 /cdrom/datei3 /cdrom/verz1 /cdrom/verz2 . -R cp erhält als erstes Argument /cdrom/datei1. Da ist kein - vor; also ist es keine Option. Damit hat dieser Befehl keine Optionen, was ja auch nicht weiter schlimm ist. Alle Argumente sind eigentliche Argumente. Somit werden die Argumente /cdrom/datei1 bis zu /cdrom/verz2 und . als zu kopierende Dateien interpretiert, die nach dem Verzeichnis -R kopiert werden sollten. Da ein Verzeichnis -R wohl nicht existiert, kommt es zu einer Fehlermeldung. [1] Das hier /bin/cp genommen wird, liegt daran, daß (hoffentlich) /bin das erste Verzeichnis im Pfad, der Shellvariable $PATH, ist, die eine Datei cp enthält. [2] Anders als in DOS macht das bei UNIX/Linux die Shell. Das hat den Vorteil, daß die einzelnen Programmen sich nicht um die Ersetzungen zu kümmern brauchen, was wiederum den Vorteil hat, daß es einheitlich gehandhabt wird und es bei jedem Befehl funktioniert. Hat aber andererseits den Nachteil, daß das einzelne Programm gar nicht mitbekommt, daß man da einen * und nicht den vollen Namen angegeben hat. Macht aber meist nichts. Muß man nur wissen, dann wird einem vieles klarer. [3] C zählt die Argumente mit null beginnend. Da aber dieses erste, also nullte Argument der Befehl selber ist, und meist unwichtig, schreibe ich nicht erstes Argument, sondern nulltes Argument, um nicht noch mehr zu verwirren. Mit erstes Argument bezeichne ich dann das Argument, das auch der Anwender als erstes empfindet als solches. Ein nulltes Argument gibt es daher, da sich manche Programme in ihrer Eigenschaft unterscheiden, je nachdem wie sie heißen. Ein und die gleiche Datei können unter Linux ja andere Namen haben. [4] Dies ist allerdings Programmabhängig. Muß nicht immer so sein. Aber es gibt die Systemroutine getopt, mit der man leicht die in Linux übliche Optionenstrategie bearbeiten kann. So ist es, wenn der Programmierer getopt verwendet hat egal, ob man -abc oder -a -b -c oder -a -bc als Option hat. Diese Systemroutine ist auf man 3 getopt beschrieben. Es gibt auch was ähnliches für Shellskripte, daß darauf beruht, siehe hierzu man 1 getopt, außerdem hat die bash einen ähnlich aufgebauten shellinternen Befehl getopts, siehe hierzu help getopts und man bash. [5] Eigentliches Argument habe ich hier geprägt. Es ist kein Begriff, den es in der Literatur gibt. Mir fiel aber nichts bessers ein. [6] Bei nur zwei Argumente ohne bestimmte Optionen, wird das zweite Argument als Dateiname interpretiert. So wird mit cp alt neu, die Datei alt nach der Datei neu geschrieben. Existiert neu nicht, so wird neu angelegt, andernfalls überschrieben. Dahingegen kopiert cp alt1 alt2 neu die Dateien alt1 und alt2 in das Verzeichnis neu. Dieses Verzeichnis muß existieren. Es werden somit die Daeien neu/alt1 und neu/alt2 existieren. [7] In jedem Verzeichnis steht . es ist ein Hardlink auf sich selbst. Weiter gibt es in jedem Verzeichnis .. das ist ein Hardlink auf das nächst höhere Verzeichnis. PS: Lies Dir mal /usr/doc/HOWTO/de/DE-DOS-nach-Linux-HOWTO durch. PPS: Ich habe um nicht noch mehr Verwirrung zu stiften, die Komandozeilen so gelassen, auch wenn sie etwas zu lang sind. Bernd -- Was ist quoten? Quoten ist das Zitieren aus einer mail, der man antwortet. Und wie macht man es richtig? Zitate werden mit "> " gekennzeichnet. Nicht mehr als nötig zitieren. Vor den Abschnitten das Zitat, auf das man sich bezieht, mit einer Zeile Abstand oben und unten. |Zufallssignatur 12 --------------------------------------------------------------------- To unsubscribe, e-mail: suse-linux-unsubscribe@suse.com For additional commands, e-mail: suse-linux-help@suse.com