Zitat von
McFraggle
Sieht wirklich etwas wirr aus. Aber gut zu wissen...
Ist aber ziemlich logisch, man muss nur richtig zählen ;-) In jeder weiteren Subshell muss der Backtick gegenüber der darüberliegenden Shell entwertet sein, also Backslash. Und den Backslash muss man ab der 2. Ebene auch tarnen, damit er nicht als Entwerter interpretiert wird, also kommen dann immer 2 \ pro Subshell dazu.Man muss einfach mal die Subshells hinabklettern und sich überlegen, was die jeweils amtierende Shell mit den Zeichen macht:
Code:
echo H`echo a\`echo l\\\`echo l\\\\\\\`echo o\\\\\\\`\\\`\``
# ich, die Shell führe aus (wenn ich vom Nachkommen die Anwort habe):
# echo H`...`; und nachdem ich fleissig substituiert habe (jedes nach einem
# \ stehende Zeichen nehme ich so, wie es ist und entferne den Entwerter \
# davor), bleibt das innerhalb der Backticks fuer den Sohnemann uebrig:
echo a`echo l\`echo l\\\`echo o\\\`\``
# jetzt bin ich, die erste Subshell dran. Ich muss also ausführen:
# echo a`...` und ich substituiere wie mein Papa. Übrig bleibt fuer den Enkel:
echo l`echo l\`echo o\``
# so, endlich ist die Jugend dran. Ich habe alles von meinen Vorfahren geerbt,
# muss dies hier ausfuehren:
# echo l`...` und der Urenkel kriegt ne leichte Aufgabe:
echo l`echo o`
# ich bin erst in der Grundschule, ich muss nicht mehr substituieren (kann ich
# ja noch gar nicht, kommt erst in der 3. Klasse dran), ich tue:
# echo l`...` und schicke alles zwischen den `` an die Teppichratte:
echo o
# ich liege ja noch in den Windeln (5 Generationen unter einem Dach -
# Donnerwetter!), deshalb muss ich nur mein erstes Wort sprechen, nachdenken
# brauche ich noch nicht:
o
# Manno, der kleine Windelpupser braucht aber! Jetzt hab ich seine Antwort,
# er hat nur ein "o" rausgebracht und ich tue mein Teil dazu mit
# "echo l`echo o`":
lo
# die Kleinen lernen aber auch gar nix mehr heute. Endlich kann ich meinen
# Senf dazugeben, mit "echo l`echo lo`" wird das zu:
llo
# na endlich bin ich wieder dran, ich mache aus "echo a`echo llo`":
allo
# Hach, die Jugend! Wir waren damals nicht so lahm. Nur ich kann sowas:
# aus "echo H`echo allo`" mache ich:
Hallo
Alles klar?
Jan
EDIT: Um das Ganze rückwärts zu machen, gibt es eine einfache Regel: Jedes für die darüberliegende Shell als Steuerzeichen zu interpretierende Zeichen muss entwertet werden. Im vorliegenden Beispiel musst Du also vor jeden existierenden Backtick und Backslash einen Backslash setzen, wenn Du eine weitere ``-Ebene einziehst. Ich erspare mir mal einen weiteren Generationen-Disput ;-)
Lesezeichen