Hi, mich treiben die Hochkommas noch in den Wahnsinn ;-) Wo kann ich nachlesen, wann ich welche verwenden kann, bzw. muss? Viele Grüße Dieter
Am Montag, 10. März 2003 09:23 schrieb dkroemer@t-online.de: Hallo dkroemer, [ komischer Name, wie waere es mit realname? ]
mich treiben die Hochkommas noch in den Wahnsinn ;-) Wo kann ich nachlesen, wann ich welche verwenden kann, bzw. muss?
zB. hier: http://www.selflinux.de/html/Shellprogrammierung03.html#d73e807 MfG Th. Moritz
Hallo Thomas und alle anderen Helferlein, Thomas Moritz schrieb:
Hallo dkroemer, [ komischer Name, wie waere es mit realname? ]
Sorry, passierte nur weil ich über web.t-online verschickt habe; ich hoffe jetzt habe ich das richtig umgestellt - falls nicht: ich bin Dieter Kroemer ;-) Allen h_e_r_z_l_i_c_h_e_n Dank zu meinen '"...-Problem MfG Dieter
Moin dkroemer, * dkroemer@t-online.de schrieb am 10 Mar 2003:
mich treiben die Hochkommas noch in den Wahnsinn ;-)
Wo kann ich nachlesen, wann ich welche verwenden kann, bzw. muss?
Kommt drauf an, wo du sie verwenden willst ... bash -> man bash perl -> man perl .. *scnr* In der Bash benutzt du " um Text zu quoten, wobei Ersetzungen (z.B. von Variablen) weiterhin funktionieren. Innerhalb von ' finden keine Ersetzungen mehr statt. Die ` benutzt du, um einen Befehl (den innerhalb der `) auszuführen und dessen Ausgabe als Rückgabe bzw. als Wert zu erhalten, z.B. in VARIABLE=`pwd` (es gibt bessere Beispiele). Gruß, Sebastian -- Do not meddle in the affairs of wizards, for they are subtle and quick to anger. Sebastian Helms - http://www.helms.sh - mailto:mail@helms.sh (PGP welcome) SuSE-Linux-Mailinglisten-FAQ: http://www.helms.sh/faq/
Moin. Vielleicht dumme Frage, aber: Sebastian Helms, Montag, 10. März 2003 09:40:
Die ` benutzt du, um einen Befehl (den innerhalb der `) auszuführen und dessen Ausgabe als Rückgabe bzw. als Wert zu erhalten, z.B. in VARIABLE=`pwd` (es gibt bessere Beispiele).
Wozu brauche ich denn dann sowas wie xargs? Wie ich soeben probiert habe ist find / -name test | xargs rm gleichbedeutend mit rm `find / -name test` Schneller geht letzteres auch noch: andy@scarabaeus:~/Desktop/x> time find . | xargs rm [...] real 0m0.148s user 0m0.020s sys 0m0.120s und andy@scarabaeus:~/Desktop/x> time rm `find .` [...] real 0m0.139s user 0m0.020s sys 0m0.120s Oder stellt sich die Frage so überhaupt nicht? -- Andreas Feile www.feile.net
Peter Wiersig, Montag, 10. März 2003 10:31:
probier mal "echo `find / -type f`" und "find / -type f | xargs echo" aus.
Hmm, da seh ich im ersten Fall nur stderr, im zweiten auch stdout? Warum ist das so? man echo hat mich da nicht wirklich weitergebracht... Oder ist das, was ich im zweiten Fall sehe, gar nicht stdout? Grübel... -- Andreas Feile www.feile.net
Andreas Feile wrote:
Peter Wiersig, Montag, 10. März 2003 10:31:
probier mal "echo `find / -type f`" und "find / -type f | xargs echo" aus.
Hmm, da seh ich im ersten Fall nur stderr, im zweiten auch stdout? Warum ist das so? man echo hat mich da nicht wirklich weitergebracht...
echo ist nur Mittel zum Zweck.
Oder ist das, was ich im zweiten Fall sehe, gar nicht stdout?
Also, im ersten Fall soll rauskommen: "cmdline too large" und im zweiten Fall halt der Inhalt deines Filesystems. Das bei dir "rm `find / -name test`" funktionierte war darin begruendet, das deine Kommandozeile nicht zu voll wurde. (BTW: Mach mal "rpm -V sh-utils") Peter
Peter Wiersig, Montag, 10. März 2003 11:00:
Also, im ersten Fall soll rauskommen: "cmdline too large" und im zweiten Fall halt der Inhalt deines Filesystems.
OK, also ich habe diesmal den Befehl vollständig durchlaufen lassen (also echo `find / -type f`). Und da seh ich zuerst ein paar Fehlermeldungen, dann nach einiger Zeit den Inhalt meines Dateisystems. Ein cmdline too large kommt da nicht raus dabei.
(BTW: Mach mal "rpm -V sh-utils")
scarabaeus:/home/andy # rpm -V sh-utils scarabaeus:/home/andy # ?? -- Andreas Feile www.feile.net
Andreas Feile wrote:
Peter Wiersig, Montag, 10. März 2003 11:00:
Also, im ersten Fall soll rauskommen: "cmdline too large" und im zweiten Fall halt der Inhalt deines Filesystems.
OK, also ich habe diesmal den Befehl vollständig durchlaufen lassen (also echo `find / -type f`). Und da seh ich zuerst ein paar Fehlermeldungen, dann nach einiger Zeit den Inhalt meines Dateisystems. Ein cmdline too large kommt da nicht raus dabei.
Hm, bei mir auch nocht nicht. Aber ich musste den find auch unterbrechen, weil der die ganzen Netzwerk-Freigaben auch durchgraste. und das dauert zu lange und belastet das Netz zu sehr. mit "find / -type f 2>/dev/null" kann man die Fehlermeldungen unterdruecken.
(BTW: Mach mal "rpm -V sh-utils")
scarabaeus:/home/andy # rpm -V sh-utils scarabaeus:/home/andy #
Keine Ausgabe - gute Antwort. Ich hab nicht richtig nachgeschaut und hatte in Erinnerung, das du "rm `find / -name test`" ausgefuehrt hast. Wenn man das als root macht, durefte man /usr/bin/test loeschen. Dir ist das nicht Passiert, sonst waere "missing: /usr/bin/test" aufgetaucht.
Peter Wiersig wrote:
Andreas Feile wrote:
Ein cmdline too large kommt da nicht raus dabei.
Hm, bei mir auch nocht nicht.
Auch beim kompletten Durchlauf klappt die zweite Form. Liegt moeglicherweise daran, das echo ein Shell-Builtin ist. Aha: Hier die Fehlermeldung: $ /bin/echo `find / -xdev -type f 2>/dev/null` bash: /bin/echo: Argument list too long Peter
Peter Wiersig, Montag, 10. März 2003 12:38:
(BTW: Mach mal "rpm -V sh-utils")
scarabaeus:/home/andy # rpm -V sh-utils scarabaeus:/home/andy #
Keine Ausgabe - gute Antwort. Ich hab nicht richtig nachgeschaut und hatte in Erinnerung, das du "rm `find / -name test`" ausgefuehrt hast.
Das hatte ich geschrieben, ja, aber nicht gemacht. ;) War mehr so als Beispiel gedacht gewesen. Guter Tip trotzdem... Und guter Thread. Hab dabei wieder mal viel gelernt. Gruß. Andy -- Andreas Feile www.feile.net
Moin Andreas, * Andreas Feile schrieb am 10 Mar 2003:
Sebastian Helms, Montag, 10. März 2003 09:40:
Die ` benutzt du, um einen Befehl (den innerhalb der `) auszuführen und dessen Ausgabe als Rückgabe bzw. als Wert zu erhalten, z.B. in VARIABLE=`pwd` (es gibt bessere Beispiele).
Wozu brauche ich denn dann sowas wie xargs? Wie ich soeben probiert habe ist
find / -name test | xargs rm
Weil es sein kann, daß find (oder ein anderes Programm) so viele Argumente zurückliefern, daß diese nicht alle über die Kommandozeile übergeben werden können. Siehe auch man xargs ... *g*
gleichbedeutend mit
rm `find / -name test`
Wenn es nur ein paar Dateien sind, kannst du auch die zweite Variante nehmen. Allerdings weiß ich nicht, wie das ist, wenn Sonderzeichen in den Dateinamen sind. Da bietet sich find -print0 | xargs -0 an. Gruß, Sebastian -- Do not meddle in the affairs of wizards, for they are subtle and quick to anger. Sebastian Helms - http://www.helms.sh - mailto:mail@helms.sh (PGP welcome) SuSE-Linux-Mailinglisten-FAQ: http://www.helms.sh/faq/
On Mon, 10 Mär 2003 at 11:49 (+0100), Sebastian Helms wrote:
Moin Andreas,
* Andreas Feile schrieb am 10 Mar 2003:
Sebastian Helms, Montag, 10. März 2003 09:40:
Die ` benutzt du, um einen Befehl (den innerhalb der `) auszuführen und dessen Ausgabe als Rückgabe bzw. als Wert zu erhalten, z.B. in VARIABLE=`pwd` (es gibt bessere Beispiele).
Wozu brauche ich denn dann sowas wie xargs? Wie ich soeben probiert habe ist
find / -name test | xargs rm
Weil es sein kann, daß find (oder ein anderes Programm) so viele Argumente zurückliefern, daß diese nicht alle über die Kommandozeile übergeben werden können.
Das ist aber gerade in Verbindung mit find kein Argument: find / -name test -exec rm {} \; xargs ist hier eher ein Mittel zum Schonen der Systemressourcen, weil im Gegensatz zum -exec nicht für jede gefundene Datei ein neuer Prozess gestartet wird.
Siehe auch man xargs ... *g*
gleichbedeutend mit
rm `find / -name test`
Wenn es nur ein paar Dateien sind, kannst du auch die zweite Variante nehmen.
Allerdings weiß ich nicht, wie das ist, wenn Sonderzeichen in den Dateinamen sind. Da bietet sich find -print0 | xargs -0 an.
Und das ist der 2. gute Grund zur Verwendung von xargs ;-) BTW: Diese *argument list too long* Fehler kann man auch mit Schleifen umgehen: statt: rm * geht dann: for i in *; do rm $i; done Jan
Moin Jan, * Jan Trippler schrieb am 10 Mar 2003:
On Mon, 10 Mär 2003 at 11:49 (+0100), Sebastian Helms wrote:
* Andreas Feile schrieb am 10 Mar 2003:
Sebastian Helms, Montag, 10. März 2003 09:40:
Die ` benutzt du, um einen Befehl (den innerhalb der `) auszuführen und dessen Ausgabe als Rückgabe bzw. als Wert zu erhalten, z.B. in VARIABLE=`pwd` (es gibt bessere Beispiele).
Wozu brauche ich denn dann sowas wie xargs? Wie ich soeben probiert habe ist
find / -name test | xargs rm
Weil es sein kann, daß find (oder ein anderes Programm) so viele Argumente zurückliefern, daß diese nicht alle über die Kommandozeile übergeben werden können.
Das ist aber gerade in Verbindung mit find kein Argument: find / -name test -exec rm {} \;
Es gibt immer mehr als einen Weg :-)
BTW: Diese *argument list too long* Fehler kann man auch mit Schleifen umgehen: statt: rm * geht dann: for i in *; do rm $i; done
Damit bekommst du üble Probleme, wenn Leerzeichen oder Newlines in den Dateinamen sind, und _so_ geht es auch nicht rekursiv... Aber prinzipiell gehts natürlich auch so. Es gibt immer mehr als einen Weg *bg* Gruß, Sebastian -- Do not meddle in the affairs of wizards, for they are subtle and quick to anger. Sebastian Helms - http://www.helms.sh - mailto:mail@helms.sh (PGP welcome) SuSE-Linux-Mailinglisten-FAQ: http://www.helms.sh/faq/
Moin, On Mon, 10 Mär 2003 at 22:19 (+0100), Sebastian Helms wrote: > * Jan Trippler schrieb am 10 Mar 2003: [...] > > BTW: Diese *argument list too long* Fehler kann man auch mit > > Schleifen umgehen: > > statt: rm * > > geht dann: for i in *; do rm $i; done > > Damit bekommst du üble Probleme, wenn Leerzeichen oder Newlines in > den Dateinamen sind, und _so_ geht es auch nicht rekursiv... Mit den Newlines hast Du recht (da haben eigentlich so gut wie alle Programme Probleme mit), mit Leerzeichen nicht. Das ist ein übler Aberglaube ;-) jan@k500:~/tmp/schleife> touch "1. datei mit blank" "noch ne datei mit leerzeichen" jan@k500:~/tmp/schleife> ll insgesamt 0 -rw-r--r-- 1 jan users 0 Mär 11 20:16 1. datei mit blank -rw-r--r-- 1 jan users 0 Mär 11 20:16 noch ne datei mit leerzeichen jan@k500:~/tmp/schleife> for i in *; do > echo $i > done 1. datei mit blank noch ne datei mit leerzeichen jan@k500:~/tmp/schleife> for i in *; do rm "$i"; done jan@k500:~/tmp/schleife> Rekursion geht natürlich nur mit etwas mehr Aufwand:rekursion { cd "$1" for i in * .[^.]* ..?*; do if test -d "$i"; then rekursion "$i" cd "$1" rmdir -- "$i" elif test -e "$i"; then rm -- "$i" fi done } rekursion . bash fetzt :-) Jan
Moin Jan, * Jan Trippler schrieb am 11 Mar 2003:
On Mon, 10 Mär 2003 at 22:19 (+0100), Sebastian Helms wrote:
* Jan Trippler schrieb am 10 Mar 2003: [...]
BTW: Diese *argument list too long* Fehler kann man auch mit Schleifen umgehen: statt: rm * geht dann: for i in *; do rm $i; done
Damit bekommst du üble Probleme, wenn Leerzeichen oder Newlines in den Dateinamen sind, und _so_ geht es auch nicht rekursiv...
Mit den Newlines hast Du recht (da haben eigentlich so gut wie alle Programme Probleme mit), mit Leerzeichen nicht. Das ist ein übler Aberglaube ;-)
Ich korrigiere mich: in for-Schleifen mit Globbing gehts *g* Aber bei solchen ungehörigen Sachen wie Dateinamenlisten und Konstrukten wie for FILE in `cat dateiliste`; do ... gehts höllisch in die Hose (wie ich auch schon feststellen mußte...) Aber selbst da kann man mit IFS dran drehen, aber das wird dann umständiger als find :-) Gruß, Sebastian -- Do not meddle in the affairs of wizards, for they are subtle and quick to anger. Sebastian Helms - http://www.helms.sh - mailto:mail@helms.sh (PGP welcome) SuSE-Linux-Mailinglisten-FAQ: http://www.helms.sh/faq/
* dkroemer@t-online.de schrieb am 10.Mär.2003:
mich treiben die Hochkommas noch in den Wahnsinn ;-)
Wo kann ich nachlesen, wann ich welche verwenden kann, bzw. muss?
' und " Quotieren alles was dazwichen steht. Das heißt die bash, von der reden wir hier wohl, nimmt alles als ein einzelnes Argument. Normalerweise nimmt die bash bei einem Befehl cmd foo bar foo als ein Argument und bar als das nächste. Genauer: die bash ruft den Befehl cmd auf und übergibt cmd die Argumente cmd foo und bar. Als erstes Argument wird immer der Befehlname selber übergeben. Bei der UNIX Zählung ist es das Argument 0. foo wäre in diesem Beispiel das Argument 1 und bar das Argument 2 Wenn nun stattdessen cmd "foo bar" aufgerufen wird, so wird foo bar als einzelnes Argument aufgefaßt, mit Leerzeichen dazwichen. `..` hingegen macht was ganz anderes. Hier wird alles, was zwichen den beiden ` steht als Befehl genommen, der ausgeführt wird. Dies wird dann alles inclusive der ` selber durch die Standardausgabe dieses Befehls ersetzt Um den Unterschied zwichen ' und " zu erkennen schreibst Du Dir am Besten ein kleines Progrämmchen. Ich habe es mal arg genannt: === arg ============================================= #!/bin/bash j=1 for i do echo "ARG$j: $i" j=$((j+1)) done ===================================================== Hiermit werden die Argumente angezeigt: $ arg foo bar baz ARG1: foo ARG2: bar ARG3: baz $ $ arg "foo bar" baz ARG1: foo bar ARG2: baz $ $ arg 'foo bar' baz ARG1: foo bar ARG2: baz $ $ arg "foo $SHELL bar" baz ARG1: foo /bin/bash bar ARG2: baz $ $ arg 'foo $SHELL bar' baz ARG1: foo $SHELL bar ARG2: baz Man beachte hier den Unterschied: Innerhalb von "..." werden Variablen weiter interpretiert, innerhalb von '...' werden Variablen nicht interpretiert, sie werden so genommen, wie sie da stehen. $ arg foo `date` bar ARG1: foo ARG2: Mon ARG3: Mär ARG4: 10 ARG5: 11:34:27 ARG6: CET ARG7: 2003 ARG8: bar $ $ arg "foo `date`" bar ARG1: foo Mon Mär 10 11:35:54 CET 2003 ARG2: bar $ $ arg 'foo `date`' bar ARG1: foo `date` ARG2: bar Auch hier wird bei "..." die `...` interpretiert, bei '...' hingegen wird `...` so übernommen, wie es ist. Ähnliches übrigens, wenn ein * oder ? auftaucht, die von der bash ja auch interpretiert werden. Probier es mal selber aus. Spiel auch mal mit dem \ Backslash. $ arg "foo 'bar baz'" ARG1: foo 'bar baz' $ $ arg 'foo "bar baz"' ARG!: foo "bar baz"' Sowohl innerhalb von '...' also auch von "..." wird das jeweilig andere Zeichen einfach so wie es da steht weitergegeben, an den Befehl, der aufgerufen wird. Was der damit macht, ist seine Sache. Viele Befehle interpretieren diese Zeichen ähnlich wie die shell, aber längst nicht alle. Es ist wichitg, den Erstetzungsmechanismus der shell zu verstehen. So zum Beispiel, ersetzt die Shell den * mit allen passenden Dateinamen. Das eigentliche Programm bekommt den *, wenn er nicht gequotet wurde, nicht zu Gesicht. Die $ oben am Zeilenanfang stellt den Promt dar, bitte nicht mit eingeben. 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
Hi, an Alle ein herzliches Dankeschön (das webfrontend von t-online hat mir wieder zu schaffen gemacht - ich hoffe, dass das mail jetzt nicht einige doppelt bekommen. ) Diesesmal müsste auch der realname dabei stehen - bei webmail.t-online.de habe ich das noch nicht eingestellt gahabt :-( MfG Dieter
participants (7)
-
Andreas Feile
-
B.Brodesser@t-online.de
-
dkroemer@t-online.de
-
Jan.Trippler@t-online.de
-
Peter Wiersig
-
Sebastian Helms
-
Thomas Moritz