2013-09-02T22:33:38
clms[...]
Dazu musst Du auf Perl-Ebene die Backslashes escapen, damit Du auf der Shell-Ebene einen einfachen Backslash vor dem einfachen hochkomma hast.
Also: my $a = "'var1=\"key:\\'val\\'\" var2 var3'";
Die system-Shell sieht dann folgenden Befehl:
perl tst.pl 'var1="key:\'val\'" var2 var3'
Das dürfte so wohl auch noch nicht funktionieren. Die Escapingregeln in einer üblichen Unixshell sind unterschiedlich, je nachdem ob man sich in einem einfach (
') oder doppelt (
") gequoteten String befindet.
In dem zitierten Beispiel beginnt der String
$a gleich mit einem einfachen Anführungszeichen, so dass die folgenden doppelten Anführungszeichen und Backslashes für die Shell keine spezielle Bedeutung haben, wohingegen das zweite einfache Anführungszeichen dann den String abschließt. Insgesamt ergibt sich so überhaupt kein gültiges Shellkommando!
Die Shell interpretiert
'var1="key:\'val\'" var2 var3' in Perl übersetzt als
'var1="key:\\' .. 'val\'' .. " var2 var3 und hier endet dann plötzlich die Eingabe mitten in einem doppelt gequoteten String.
Wenn man innerhalb eines einfach gequoteten Strings in der Shell ein einfaches Anführungszeichen einfügen will, muss man erst den String schließen, dann ein escapetes Anführungszeichen setzen und dann einen neuen String beginnen. Die Shell fügt ohne Leerzeichen aufeinanderfolgende Strings zu einem einzigen Token zusammen.
Kurzes Beispiel:
foo'b"a"r wird, einfach gequotet, zu
'foo'\''b"a"r'.
When C++ is your hammer, every problem looks like your thumb.