Anzeige:
Ergebnis 1 bis 11 von 11

Thema: [Perl] Dach (^) an die Shell übergeben ohne zu escapen?

  1. #1
    Registrierter Benutzer
    Registriert seit
    11.09.2003
    Beiträge
    100

    [Perl] Dach (^) an die Shell übergeben ohne zu escapen?

    Servus!

    Ich muss in einem Perlskript ein anderes Programm aufrufen und als Parameter ein paar Strings mit ^ übergeben. Leider klappt das nicht. Weder die backticks noch qx() übergibt mir die Parameter ohne das Dach herauszunehmen (...im Zuge der Interpolierung vlt.). Gibt's sonst noch eine Möglichkeit?

    Notfalls müsste ich den String mit Backslashs an entsprechenden Stellen versehen um die ^ zu escapen, aber das würde ich nur ungern. Ein Shell-Aufruf ohne Interpolierung wäre mir am liebsten.

    Gruß
    Thorsten

  2. #2
    Registrierter Benutzer
    Registriert seit
    11.09.2003
    Beiträge
    100
    Der Versuch mit dem Escapen hat im Übrigen auch gar nicht funktioniert.
    Ich hab mit
    Code:
    $commando =~ s/\^/\\\^/g;
    zwar meine ^ escapen können, aber die Shell bekommt trotzdem keine ^ sondern nur die backslashe. Hmm...irgendwie sehr merkwürdig das ganze.

  3. #3
    Registrierter Benutzer
    Registriert seit
    11.09.2003
    Beiträge
    100
    So, weitere Erkenntnisse:
    Code:
    $cmd="echo a^b";
    $rc=`$cmd`;
    print $rc;'
    Ausgabe unter Linux, Perl 5.8:
    a^b
    Ausgabe unter Solaris 8, Perl 5.0:
    a^b
    Ausgabe unter Windows 2000, ActiveState Perl 5.6:
    ab
    Schöne Scheiße!
    Und was mach ich jetzt?

  4. #4
    Registrierter Benutzer
    Registriert seit
    11.09.2003
    Beiträge
    100
    Und noch ne kleine Ergänzung:

    Ausgabe von Windows XP mit ActiveState Perl 5.8.3:
    ab
    Verdammt! Also updaten wird auch nicht helfen.

  5. #5
    Registrierter Benutzer
    Registriert seit
    19.08.2004
    Beiträge
    404
    Hmm - ich weiß zwar gerade noch nicht, warum das nicht richtig in der Shell ankommt, aber ich würde evtl. noch folgendes probieren:


    PHP-Code:
    $cmd="echo a\x5Eb"# auf die Gefahr hin, das ^b eine besondere Bedeutung  zu kommt
    oder
    $cmd
    ='echo a^b'# also single-quotes 


    Nochwas:
    falls $rc für Returncode steht, also nicht die Programmausgabe, sondern den echten exit-Code, dann kannst Du auch mal system() versuchen.

  6. #6
    Registrierter Benutzer Avatar von undefined
    Registriert seit
    01.03.2004
    Beiträge
    1.255
    Die DOS kennt kein Zirkumflex in einfacher Ausführung.
    Siehe in der DOS das Zirkumflex kommt erst nach einer Wiederholung oder Space.
    mfg undefined
    --
    Undefined Behavior (undefiniertes Verhalten) bedeutet meistens etwas ungültiges.
    xhtml Debugger

  7. #7
    Registrierter Benutzer
    Registriert seit
    24.12.2001
    Ort
    anywhere before EOF
    Beiträge
    236
    Zitat Zitat von undefined
    Die DOS kennt kein Zirkumflex in einfacher Ausführung.
    Siehe in der DOS das Zirkumflex kommt erst nach einer Wiederholung oder Space.
    Das aber mit dem Problem eigentlich nichts zu tun. das hat was mit den Keyboardeinstellungen und den sog. Deadkeys zu tun.
    Da man die Akzente für gewöhnlich (wenn man Texte schreibt, keine Programme) über anderen Buchstaben einsetzt kann man damit sowas "zusammen bauen", also zuerst ^, ` oder ` gedrückt und dann a, e, i, o oder u und man hat das die gewünschte Kombination. Da kommt aber am Schluss ein Zeichen mit nem eigenen ASCII-Code raus. Du kannst auch auf diversen *ixen das Tastaturlayout so einstellen, dass so ein Verhalten kommt, ist nur für Leute die Programmieren eher lästig. Auf Tastaturlayouts von Sprachen wo man diese Akzentbuchstaben direkt im Alphabet sind, also z. B. Frankreich, hats dann ne eigene Taste dafür u. U. Bei den Deutschen ist halt wohl so gelöst, das man zur Not nem Franzosen was schreiben kann, es aber nicht soviel Platz wegnimmt weil das ja nicht der Regelfall sein wird. Die Tastatur ist da also kein Masstab, da wird nämlich noch erst zwischen Tastaturcodes in ASCII umgesetzt.
    Wenn das Carret aber über nen String kommt gilt das also nicht mit den Deadkeys, man muss also kein "^^" schicken um "^" zu erhalten, hat schliesslich alles eigenen ASCII-Code für sich.
    Unter Windows 98 mit ActiveState Perl v5.8.6 tritt das hier beschriebene Problem übrigens nicht auf.
    chmod -R +t /*

  8. #8
    Registrierter Benutzer
    Registriert seit
    11.09.2003
    Beiträge
    100
    Danke für Eure Tipps, die Lösung ist dabei - aber sie kommt für mich auch etwas unterwartet. Also zunächst der Hex-Code, \x5E, der bringt mir leider gar keine Änderung, ebensowenig die einfachen Anführungszeichen. Folgendes bringt aber eine zumindes kleine Verbesserung:
    Code:
    $cmd='echo "a^b"';
    Und zwar ist die Ausgabe dann:
    "a^b"
    Ist aber trotzdem schlecht weil mein Programm mir die doppelten Anführungszeichen um den Parameter mit einem "diesen Parameter gibt's nicht" quittiert.

    Aber undefined hat Recht! Mit doppelten carets/Dächern/accents circumflexen, oder wie auch immer man das Dingens nennen will, funktioniert's tatsächlich!

    Vielen Dank!
    Gruß
    Thorsten

  9. #9
    Registrierter Benutzer
    Registriert seit
    24.12.2001
    Ort
    anywhere before EOF
    Beiträge
    236
    Hab das vorhin mal genauer angesehen, das "^" scheint in der CMD sowas wie ein Escapezeichen zu sein. Wenn man z. B. Auf der Konsole etwas eingibt und mit "^" abschliesst und Return drückt bekommt man eine Promt Mehr? und kan quasi auf der gleichen Zeile weitertippen:
    Code:
    C:\> echo Hallo ^
    Mehr? Welt!
    Hallo Welt!
    C.\>
    Irgendwelche Doku die sich darüber nicht ausschweigt hab ich nicht finden können, aber sieht eben so aus wie ben ein Escapezeichen...
    Also kommt das das es mit "^^" funktioniert wohl daher, dass das sowas ist wie "\\", das escapte Escapezeichen sozusagen...
    chmod -R +t /*

  10. #10
    Registrierter Benutzer
    Registriert seit
    11.09.2003
    Beiträge
    100
    Na klasse, jetzt hab' ich unter Solaris das gleiche Problem, aber die Windows-Lösung klappt nicht mehr. Hier erstmal wieder ein schönes Beispielskript:
    Code:
    #!/usr/bin/perl
    #
    my $eins="Hans^05";
    my $command = "echo $eins | grep -v nix";
    mydo($command);
    
    sub mydo
    {
      my @cmd = @_;
      print @cmd,"\n";
      my $rc=qx(@cmd);
      print $rc;
    }
    
    exit 0;
    Neu (gegnüber dem vorangegangenen hier im Thread) ist, dass beim Kommando eine Pipe dabei ist. Unter Linux kein Problem, aber unter Solaris 9 bekomme ich diesen Fehler:
    echo Hans^05 | grep -v nix
    sh: 05: not found
    Wenn ich das Dach 1x escape passiert das gleiche.
    Wenn ich den Backslash vor dem Dach escape ("\\^") oder den Backslash UND das Dach escape ("\\\^") klappt's. Okay, wieder ein toller Workaround, aber warum muss ich immer einen Workaround für etwas schreiben was unter Linux ohne Workaround funktioniert?!

  11. #11
    Registrierter Benutzer
    Registriert seit
    25.10.2004
    Beiträge
    819
    Zitat Zitat von sticky bit
    Hab das vorhin mal genauer angesehen, das "^" scheint in der CMD sowas wie ein Escapezeichen zu sein.
    Ja. Was unter Unix der Backslash ist, ist unter Windows der Circumflex.

    warum muss ich immer einen Workaround für etwas schreiben was unter Linux ohne Workaround funktioniert?!
    Weil bei freier Software jeder die Möglichkeit hat, Bugs zu korrigieren.

Lesezeichen

Berechtigungen

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