bash kommandosubstitution

Post Reply
Message
Author
hugenay

bash kommandosubstitution

#1 Post by hugenay »

hi,
manchmal ist mir die shell ein raetsel, ich kriegs zwar zum laufen, weiss aber nicht warums laeuft.
Vielleicht koennt ihr mir ja hiermit helfen:
ist ein beispiel aus einem shell-buch
es gibt 4 dateien in einem verzeichnis:
u mit dem inhalt "uv"
uv mit dem inhalt "uvw"
uvw mit dem inhalt "uvwx"
uvxw mit dem inhalt "langer satz"
plumpes beispiel, erfuellt aber seinen sinn:
cat `cat \`cat \<!--no-->\`cat u\<!--no-->\`\``
gibt jetzt den inhalt von uvwx aus.
mein problem ist, dass ich
cat `cat \`cat \<!--no-->`cat u\<!--no-->`\``
erwartet haette. Ich frag mich wo das dritte \ her kommt in der innersten klammer! Ich hab schon nen knoten im hirn.
gruss hug.

ratte

Re: bash kommandosubstitution

#2 Post by ratte »

hi, ich versteh gar nix hier...

haste geprueft, ob das forum alles so darstellt, wie du's eingegeben hast?

zur info: im *nix gilt "\" als escapezeichen, d.h. zeichen, die als befehl oder steuerzeichen interpretiert wuerden, gelten als zeichen. dasgleiche passiert hier im forum auch:

wenn du [<!--no--> schreiben willst, musst du "\<!--no-->[<!--no-->" schreiben! denn das [<!--no--> leitet eine formatierung ein
... um diese Zeile darzustellen wie beabsichtigt, musste ich "\<!--no-->[" und "\<!--no-->\<!--no-->\<!--no-->[" verwenden usw.

ratte

hugenay

Re: bash kommandosubstitution

#3 Post by hugenay »

yup, habe ich verpennt, das escape zeichen ist mir klar, aber in verschachtelten kommandosubstitutionen bringts mich schonmal durcheinander, ist ganz wie rekursive schleifen (bei kleinen prograemmchen die fakultaet berechnen zB, und da gabs ja noch das 8 Damen problem), ich denk mir nen knoten ins hirn <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">

und die forumsoftware hat wirklich verschluckt, aber auf seltsame weise, however, jetzt der richtige code:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
cat `cat \`cat \<!--no-->\<!--no-->\`cat u\<!--no-->\<!--no-->\`\``
</font><hr></pre></blockquote>

ich dachte das quote oder code tag des forums, wuerden wirklich literal posten, tja jetzt muss ich halt 5 \ machen um 3 \ wieder zu geben. Aber damit hab ichs dann auch kapiert. Ich hatte mich gewundert, dass man 3 statt 2 verwendet, aber man muss ja 3 nehmen, weil 2 ja zu einem aufgeloest werden und dann das ` allein da steht und seine sonderbedeutung behaelt.

gruss hug.

hugenay

Re: bash kommandosubstitution

#4 Post by hugenay »

achja, was die verschachtelung angeht (fast ne mathematische frage), immer wenn man eine ebene tiefer schachtelt, 'vermehren' sich auch die escape zeichen (\) und zwar immer nach dem schema x2+1 pro ebene. Das ist wahrscheinlich super banal, aber ich kanns mir gut merken!
gruss hug.

Jochen

Re: bash kommandosubstitution

#5 Post by Jochen »

Und damit man sich die Mühe gar nicht erst machen muss, sollte man in der bash und in der ksh (und damit wahrscheinlich zsh auch) anetslle von Backticks (`command`) einfach die Schreibweise $(command) verwenden. Damit wird dann aus Deinem Beispiel einfach
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
cat $(cat $(cat $(cat u)))
</font><hr></pre></blockquote>
Das innerste "cat u" gibt "uv" aus, womit das zweitinnerste cat den Inhalt der Datei uv ausgibt. Das ergibt "uvw", dessen Inhalt das dritte cat ausgibt, was uvwx macht. Das letzte cat gibt den Inhalt der Datei gleichen Namsn aus und das ist dann "langer Satz".

Aber nicht unbedingt eine empfehlenswerte Methode, so einem Command Substitution nahe bringen zu wollen. In der bash/ksh ist die Schreibweise mit $() einfachen, und in der sh kann man die Backticks nicht schachteln und muss zu Backslash-Orgien greifen. Fazit: Man lässt es oder arbeitet mit eval.

Jochen

hugenay

Re: bash kommandosubstitution

#6 Post by hugenay »

das ist natuerlich ne gute idee. Da ja in beiden faellen die shell die zeile nur durchgeht und substituiert bzw. sogar mehrfach, ist das ja geschwindigkeitsmaessig auch identisch.
Ich schau mir gerade aber die Bourne shell an, und da hab ich die backtick loesung verwenden muessen. Was (das beispiel laesst sich ja leicht erweitern) tatsaechlich zu zeilenweisen backticks fuehrte <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">
<blockquote><hr>
In der bash/ksh ist die Schreibweise mit $() einfachen, und in der sh kann man die Backticks nicht schachteln und muss zu Backslash-Orgien greifen. <hr></blockquote>
statt Backticks meinst du hier doch die $() loesung, oder? Backticks, wenn ich das wort richtig verstehe, kann man in der Bourne shell ja schon schachteln, nur eben mit backslashes.

Haste eigentlich mal mit dem Gedanken gespielt, was ueber die Shells zu schreiben? Gibt zwar viel zu dem thema, aber in den detail spart man sich oft gerne aus.

Jochen

Re: bash kommandosubstitution

#7 Post by Jochen »

Tatsache, mit den Backslash-Backticks geht's mit dem Schachteln! Trotzdem 'ne kranke Syntax...

Ne ne, mit Backticks meinte ich schon das "`"-Zeichen für die Kommando-Substitution in der Bourne-Shell. Aber da war ich im Irrtum. Hm, da diese Konstruktion aber write-only ist (man kann's einmal schreiben, aber nie mehr lesen und verstehen <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle"> ), würde ich selbst in der sh anders vorgehen:
<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
A=`cat u`
B=`cat $A`
C=`cat $B`
cat $C
</font><hr></pre></blockquote>
Aber man lernt halt nie aus.

Hm, was dazu schreiben? Tja, das ist so 'ne Sache. Ich halte zwar auch Lehrgänge zu dem Thema, benutze dazu aber eine vorgegebene Unterlage. Die kann/darf ich hier nicht publizieren, ausserdem ist sie auch nicht gut <img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">. Da ich aber momentan mit Linux-Admin-Kursen ausgelastet bin (4 Wochen im Jahr halte ich Lehrgänge im UNIX/Linux-Umfeld), passe ich lieber da meine Unterlagen an, mit denen ich die wiederum vorgegebene (wiederum schlechte) Vorlage ergänze.

Was schwebt Dir denn vor? Allgemeines? Eine FAQ zur Shell? Zu welcher?

Hmmm, da fällt mir ein, zu Regulären Ausdrücken im Shell-Umfeld (expr, sed, grep, also die einfache Variante) habe ich mal einen Crashkurs zusammengeschrieben. Ist an so was Interesse da? Müsste aber noch mal überarbeitet werden...

hugenay

Re: bash kommandosubstitution

#8 Post by hugenay »

Gute Idee mit den Variablen, klaut nur nen bisserl speicher. Steht in der manpage eigentlich, wieviel Speicher fuer ne $ Variable in Anspruch genommen wird von der bash bzw. sh? Muss ich mal nachschauen wenn ich daheim bin.

Hab mal grob nach shell infos gegoogelt. Auch auf deutsch gibts auf fast jeder url, die irgendwas mit unix/linux zu tun, was zur shell. Scheint mir uebersaettigt zu sein. Selbt buecher gibts auf deutsch schon einige. Bin aber ueberrascht, wie schlecht das buch von addison&wesley ist (helmut herold, das buch ist didaktisch katastrophal, infos hats genug!). Ne zwingende Idee (fuer ne url zB) fehlt mir aber gerade, muss zuviel arbeiten zZ -:)

Bin aber sehr an deinem crash kurs interessiert, bin auch mit ner raw-version zufrieden -:)

Post Reply