Anzeige:
Ergebnis 1 bis 15 von 15

Thema: bash: backticks verschachtelt?

  1. #1
    Registrierter Benutzer
    Registriert seit
    17.11.2005
    Beiträge
    47

    bash: backticks verschachtelt?

    Hi!
    Mit backticks kann man in der bash ja schön eine subshell starten, was ich zum Beispiel nutze um den Rückgabewert eines Programmes als Aufrufargument für ein Skript zu nutzen.
    Nun muss ich jedoch innerhalb der subshell wiederum eine subshell öffnen. Einfaches Verschachteln der Bachticks führt zu Fehlermeldungen.
    Was ich versucht habe sieht prinzipiell so aus:
    Code:
    ./script `echo "`PROGRAMM` MEHR_FORMEL" | bc`
    Ich bekomme eine Fehlermeldung der Art
    Code:
    bash: command substitution: line 1: unexpected EOF while looking for matching `"'
    bash: command substitution: line 2: syntax error: unexpected end of file
    Wie kann ich nun backticks verschachteln?

  2. #2
    Registrierter Benutzer Avatar von rais
    Registriert seit
    18.07.2005
    Beiträge
    5.862
    Frohes Neues,
    keine Ahnung, ob das auch direkt geht, aber warum setzt Du nicht einfach eine Variable dazwischen? So in der Art
    Code:
    x=`PROGRAMM`; ./script `echo "$x MEHR_FORMEL" | bc`
    MfG,
    Rainer
    There's nothing a good whack with a hammer won't fix!

  3. #3
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Das kriegst du hin indem du statt der Backticks
    Code:
    $()
    verwendest. Das ist schachtelbar.

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  4. #4
    Registrierter Benutzer
    Registriert seit
    17.11.2005
    Beiträge
    47

    Danke!

    Danke Euch beiden!
    $() wird nun verwendet.
    THNX!

  5. #5
    Registrierter Benutzer Avatar von ContainerDriver
    Registriert seit
    10.01.2003
    Beiträge
    418
    Du kannst die (geschachtelten) Backticks auch escapen (\`)

    Code:
    echo `echo \`echo \\\`echo \\\\\\\`echo Hallo\\\\\\\`\\\`\``
    .

    Sieht aber unübersichtlich aus.
    Ein gebrechlich Wesen ist der X-Server.

  6. #6
    Registrierter Benutzer
    Registriert seit
    17.11.2005
    Beiträge
    47

    Sieht wirklich etwas wirr aus. Aber gut zu wissen...

  7. #7
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Zitat Zitat von McFraggle Beitrag anzeigen

    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 ;-)
    Geändert von jan61 (03-01-2008 um 21:13 Uhr)

  8. #8
    Registrierter Benutzer Avatar von ContainerDriver
    Registriert seit
    10.01.2003
    Beiträge
    418
    Hehe, über das Bildungsgesetz habe ich mir vorhin auch Gedanken gemacht
    Für die n-te Ebene muss man 2^n - 1 mal den Backslash setzen (Zählung beginnt bei 0).

    Du hast es gut erklärt.
    Ein gebrechlich Wesen ist der X-Server.

  9. #9
    Registrierter Benutzer
    Registriert seit
    17.11.2005
    Beiträge
    47
    Tja, danke für die weiteren Infos!
    Gibt es eigentlich einen semanischen Unterschied zwischen `xyz` und $(xyz)? Passiert hier genau das Gleiche?

  10. #10
    Registrierter Benutzer
    Registriert seit
    17.06.2003
    Beiträge
    37
    Meines Wissens identisch

  11. #11
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Identisch, aber gewisse Shells können das $() afair nicht.

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  12. #12
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Zitat Zitat von kamome Beitrag anzeigen
    Meines Wissens identisch
    Ein kleiner Hinweis: Die Backtick-Masche funktioniert in jeder Shell, $(...) ist bash-spezifisch.

    Jan

  13. #13
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Ach und falls es einer noch nicht mitbekommen hat - die Backticks sind universell verwendbar, währenddem $() nur mit gewissen shells geht (bash und zsh beispielsweise).

    *scnr* und guten Abend allerseits

    Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  14. #14
    Registrierter Benutzer
    Registriert seit
    07.05.2007
    Beiträge
    656
    Zitat Zitat von peschmae Beitrag anzeigen
    Ach und falls es einer noch nicht mitbekommen hat - die Backticks sind universell verwendbar, währenddem $() nur mit gewissen shells geht (bash und zsh beispielsweise).
    Sag ich doch ;-)

    Jan

    @peschmae: Ich habe den Teil nach dem Komma von Deinem Beitrag am 5. 1. tatsächlich überlesen - sorry.
    Geändert von jan61 (12-01-2008 um 18:58 Uhr)

  15. #15
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    Zitat Zitat von jan61 Beitrag anzeigen
    Sag ich doch ;-)
    Ich doch auch :-)
    @peschmae: Ich habe den Teil nach dem Komma von Deinem Beitrag am 5. 1. tatsächlich überlesen - sorry.
    Ich dafür den hier *g

    MfG Peschmä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •