Ich habe ein Bash-Skript, das ein anderes Bash-Skript aufruft. Das aufgerufene Skript führt einige Änderungen und Überprüfungen einiger Dinge durch, verschiebt und übergibt dann den Rest der Befehlszeile des Aufrufers.Parameterliste mit doppelten Anführungszeichen wird nicht richtig in Bash übergeben
In dem aufgerufenen Skript habe ich überprüft, dass ich alles verwaltet habe und bereit zu rufen. Hier einige Debug-Stil Code, den ich in gesteckt haben:
echo $SVN $command [email protected] > /tmp/shimcmd
bash /tmp/shimcmd
$SVN $command [email protected]
nun in/tmp/shimcmd Sie werden sehen:
svn commit --username=myuser --password=mypass --non-interactive --trust-server-cert -m "Auto Update autocommit Wed Apr 11 17:33:37 CDT 2012"
Das heißt, der eingebaute Befehl, alle auf einer Linie, völlig in Ordnung, einschließlich einer -m "meine Schnur mit Leerzeichen" Teil.
Es ist perfekt. Und die Ausführung "bash/tmp/shimcmd" funktioniert auch perfekt.
Aber natürlich will ich nicht diese alberne tmp-Datei und so (nur zum Debuggen verwendet). Das Problem besteht darin, dass dem Aufruf des Befehls direkt, anstatt über die Shim-Datei:
$SVN $command [email protected]
Ergebnisse im SVN-Befehl selbst nicht die Zeichenfolge in Anführungszeichen mit Leerzeichen empfangen - es garbles die ‚-m‚meine Zeichenfolge mit Leerzeichen‘ 'Parameter und shanks den Befehl, als ob es übergeben wurde als' -m meine Zeichenfolge mit Leerzeichen '.
Ich habe alle Arten von verrückten Fluchtmethoden vergeblich versucht. Ich kann nicht glauben, dass es mich so schlimm trifft. Wenn Sie das Gleiche ($ SVN $ command $ @) in einer Datei wiederholen und diese Datei dann ausführen, ist es FINE. Aber das Aufrufen von direkt verzerrt die Zeichenfolge in Anführungszeichen. Dieses Element allein schießt.
Irgendwelche Ideen?
Dan
Können Sie einige genaue Schritte Post dieses Verhalten zu bekommen? Ich habe Probleme, das Problem zu reproduzieren. – jimw
@jimw es ist eine sehr häufige Antipattern - im Grunde können Sie nicht auf String-Splitting zählen, um das Richtige zu tun; Er sollte stattdessen Arrays verwenden. –
Sehr wahr.Normalerweise kann ich diese Zitate durch Fiedeln herausholen, aber du hast absolut recht, wenn wir über gute Programmierpraxis sprechen. Ich muss zugeben, wenn ich in meinem Bash-Skript auf Arrays angewiesen bin, wende ich mich normalerweise Perl oder Python zu. – jimw