Escaping-backslash in windows-Pfade übergeben, um unix-Programme
Ich versuche zu entkommen backslashes in cygwin, aber es scheint fast unmöglich
Ich habe versucht, eine Menge Dinge, aber keine funktioniert richtig..
echo "C:\Users\Ted\Documents\Unix\Scripts" | xargs echo
echo 'C:\Users\Ted\Documents\Unix\Scripts' | xargs echo
Genauer gesagt brauche ich, um einen Befehl zum empfangen von Eingabe in der bash ohne
verlieren Sie die backslash-Zeichen. jedes mal, wenn ich versuche zu pass argument
die Schrägstriche immer verschwinden, zerstören meine Eingabe. Und ich weiß nicht,
wie kann ich es sagen, lassen Sie einfach die Schrägstriche auf den Eingang allein.
Ich habe Folgendes versucht, aber keiner scheint Arbeit
alias cyg0='cygpath '$*' '
alias cyg1='cygpath "$*" '
alias cyg2='cygpath "'$*'"'
alias cyg3='cygpath '$@' '
alias cyg4='cygpath "$@" '
alias cyg5='cygpath "'$@'"'
Ted@Machine01 ~
$ cyg0 C:\Users\Ted\Music\Enigma
C:UsersTedMusicEnigma
Ted@Machine01 ~
$ cyg1 C:\Users\Ted\Music\Enigma
cygpath: can't convert empty path
Ted@Machine01 ~
$ cyg2 C:\Users\Ted\Music\Enigma
cygpath: can't convert empty path
Ted@Machine01 ~
$ cyg3 C:\Users\Ted\Music\Enigma
C:UsersTedMusicEnigma
Ted@Machine01 ~
$ cyg4 C:\Users\Ted\Music\Enigma
C:UsersTedMusicEnigma
Ted@Machine01 ~
$ cyg5 C:\Users\Ted\Music\Enigma
cygpath: can't convert empty path
Durch die Art und Weise, ich will in der Lage sein zu geben C:\Users\Ted\Music\Enigma ohne
Zitate. Eines dieser Aliase funktioniert bei der Verwendung von Anführungszeichen.
Ted
Legen Sie die
x
option, um zu sehen, genau wie bash ist munging Saiten. Nur Frage set -x
.
InformationsquelleAutor Flethuseo | 2011-11-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bitte Lesen Sie den Abschnitt ZITIEREN, in der bash(1) (
man bash
).In deinem ersten Beispiel,
der shell interpretiert (und dann entfernt) umgekehrte Schrägstriche innerhalb von doppelten Anführungszeichen, so ist der erste
echo
Befehl sieht nur den stringC:UsersTedDocumentsUnixScripts
.In Ihrem zweiten Beispiel,
den einfachen Anführungszeichen korrekt zu schützen, die umgekehrte Schrägstriche, wie man sehen kann, laufen nur die ersten
echo
Befehl, ohne die| xargs echo
.In allen übrigen Beispielen
da das argument (
C:\Users\Ted\Music\Enigma
) ist ohne Anführungszeichen, mal wieder die shell interpretiert und entfernt die backslashes vor den Befehl (cyg0
,cyg1
, ...) nie sieht. Und...Sorry, es kann nicht getan werden. Wenn Sie nicht setzen die backslashes in einfache Anführungszeichen, die von der shell interpretiert jeweils als quoting-Zeichen für das Zeichen, folgt ihm, dann entfernen Sie den umgekehrten Schrägstrich.
Haben Sie ein paar Optionen:
Verwenden Sie einfache Anführungszeichen in der Befehlszeile, zum Schutz der umgekehrte Schrägstriche:
Zitieren, jeder umgekehrte Schrägstrich getrennt, durch Verdopplung, z.B.
Schrägstriche statt:
Option 3 könnte wirklich Ihre beste Lösung sein. Leider ist der umgekehrte Schrägstrich ist einfach ein ganz besonderer Charakter für alle Unix-shells, und dies verursacht eine Menge zu zitieren, Probleme beim Umgang mit DOS/Windows-Pfade. Aber das, was nicht allgemein bekannt ist, dass DOS/Windows auch vollkommen glücklich, verwenden Sie den Schrägstrich (
/
) als Pfadtrennzeichen. Versuchen Sie es.Hinweis: Ihre mehrere cyg* - Funktionen, nur cyg1 und cyg4 korrekt sind. Die anderen verwenden, falsch zu zitieren. cyg1 ist nur sinnvoll mit einem argument, da er sich alle Argumente zusammen, die in einer Zeichenfolge in Anführungszeichen, während cyg4 akzeptieren kann und pass auf, mehrere Argumente zu cygpath. Da jedoch cyg4 übergibt nur auf seine zitierten Argumente, es nicht fügen Sie einen beliebigen Wert; es ist wirklich nicht anders aus, nur z.B.
Glück.
InformationsquelleAutor Andrew Schulman
Ich hatte ein ähnliches problem beim Lesen einen Pfad aus dem windows explorer eingefügt in die Befehlszeile ein:
Den "read-r xyz" - Befehl (mit arg. "-r") nicht interpretieren einfache umgekehrte Schrägstriche im Pfad eingefügt.
Vittorio
InformationsquelleAutor Vittorio Muth
Manchmal ist es sinnvoll, Handbücher der verwendeten Programme versuchen 🙂 . Von
man xargs
:Diese option in der Tat bewahrt die ganze Zeile ist. Versuchen:
Die "-0" tut es für Sie!
Beachten Sie, dass für mehr als eine arg muss null-beenden Sie die Argumente, zum Beispiel durch
find ... -print0
odergrep ... --null
.Ihre Beobachtung war richtig für die originelle Antwort, aber ich glaube, es war nur ein versehen. Die Idee, die
-0
ist sehr nützlich (und ich hatte vergessen, die option erhält alle Sonderzeichen), damit ich die Freiheit genommen um den Fehler zu beheben, die Sie darauf hingewiesen, um die Antwort mehr nützlich als Blaupause.ich verlor meinen Verstand Debuggen, warum ich nicht bekommen konnte
sed
zu konvertieren, die Dinge, bis diese zeigte mir, dass es der Letztexarg
war mangeln Dinge. seine weniger über das Lesen der Anleitung wird nicht mehr über die Behandlung jedes Teil das Kommando, das nicht funktioniert, mit den gleichen Verdacht.InformationsquelleAutor newby2000
Ich erkenne diese Antwort ist ziemlich spät zu der party... aber ich stolperte über diese Frage, während mit den gleichen Schwierigkeiten mich.
War ich mit 'xargs' aus einer Cygwin-installation - UND - ich war die Berufung auf Sie aus einem normalen
cmd.exe
shell.Für mich, ich benutzte einfach den
tr
- Dienstprogramm, das auch in der Cygwin-Ordner:dir /b /s /a *.txt | tr "\\" "/" | xargs ...
Diese vollständig gelöst mein "slash problem".
InformationsquelleAutor CrashNeb
Ich hatte das gleiche problem, beim konvertieren von Dateinamen wie z.B. c:\dirname zu cygpath-unix mit der ich immer war c:dirname, und noch merkwürdiger Sachen.
Stellt sich allerdings heraus, dass mein problem die Dateinamen war ich mit der Eingabe von Benutzern, die ich war das abrufen mit dem "read" Befehl. Die lese -, nicht cygpath, lag die Ursache für meine Probleme durch das werfen aus dem umgekehrten Schrägstrich ein. "read-r" das problem behoben.
InformationsquelleAutor Urthona
Versuchen:
xargs -0 option Erklärung (von gnu.org):
"Input-Datei-Namen werden durch ein Nullzeichen statt durch ein Leerzeichen, und alle Anführungszeichen und backslash-Zeichen nicht als Sonderzeichen betrachtet (jedes Zeichen wird wörtlich genommen). Deaktiviert das Ende der Datei, die Zeichenkette, die behandelt wird wie jedes andere argument."
ODER
Können Sie auch erreichen dies mit sed:
Diese ersetzen alle Einzelzimmer
\
mit Doppel -\\
bevor es übergeben wird an xargs, wo die double\\
wird dann abgestreift werden wieder einzelne\
anstelle der original-single zu keine.sed ist ein nützliches stream-editor-tool, das verwendet werden kann, für einfachen text ersetzt. Hier ist ein tutorial mit einige gute Beispiele.
Syntax für die substitution ist wie folgt:
s/string_to_replace/replace_with/g
g
- Modifizierer wird verwendet, um zu ersetzen alle vorkommen. Ohne Sie ist nur der erste match ersetzt werden würde.sed 's/\\/\\\\/g'
werden verwendet, um Flucht jeder\
Charakters eine Besondere Bedeutung. Also\\
wäre der wörtliche Charakter\
, und\\\\
wäre\\
.Für keine Zitate, Sie müssten
\\
statt\
als Antwort markiert schlägt.InformationsquelleAutor lkisac