ls (1) verhält sich seltsam, wenn die Eingabe eine Variable / ein Unterbefehl ist oder nur eingegeben wird

394
n2omatt

D

Ich habe ein Problem mit ls (1), dass ich fast sicher bin, dass es eine dumme Sache ist, die ich einfach verliere. Ich kann sowieso nicht verstehen, warum das nicht funktioniert.

Ich verwende bash für cygwin (Fragen Sie nicht nach dem Grund ... Ich muss nur :() Hier ist die vollständige (sinnvolle) --version-Ausgabe: GNU bash, version 4.4.12(3)-release (x86_64-unknown-cygwin)

Ich habe mit cygpath herumgespielt, um die Unix- / Windows-Pfade für mich zu konvertieren, sodass ich die meiste Zeit auf dem Terminal bleiben kann und trotzdem die Windows-Pfade bekommen kann und umgekehrt.

So weit, so gut ... aber unter NT nervt es, dass so viele Pfade Leerzeichen und andere Zeichen haben, die nicht so recht auf die Pfade passen ( ). Um mir dabei zu helfen, habe ich gerade ein Oneliner-Skript geschrieben, um alle Pfade mit Backslashes zu entkommen, so dass ich einen gültigen Pfad habe, egal welche Verrücktheit Fenster sie haben.

Bis jetzt noch so gut ... Aber dann bin ich auf ein Problem gestoßen, das die ls (1) über die Pfade verwirrt. Es ist irgendwie schwer zu erklären, also werde ich einige Beispiele geben!

## Lets imagine that I want to get the "unix" version of C:\Program Files (x86) ## And for sake of simplicty I'll call the oneliner sript as unix_path.  unix_path "C:\Program Files (x86)" ## prints /cygdrive/c/Program\ Files\ \(x86\)  my_path=$(unix_path "C:\Program Files (x86)"); echo $my_path; ## prints /cygdrive/c/Program\ Files\ \(x86\)  ## Until now, we're good! ## But the next commands really bugs me...  ls $my_path; ## ls: cannot access '/cygdrive/c/Program\': No such file or directory ## ls: cannot access 'Files\': No such file or directory ## ls: cannot access '\(x86\)': No such file or directory  ls $(unix_path "C:\Program Files (x86)") ## Same as before... ## ls: cannot access '/cygdrive/c/Program\': No such file or directory ## ls: cannot access 'Files\': No such file or directory ## ls: cannot access '\(x86\)': No such file or directory  ls "$my_path"; ## ls: cannot access '/cygdrive/c/Program\ Files\ \(x86\)': No such file or directory  ## Now is very crazy, let's imagine that I type /cygdrive/c/Program\ Files\ \(x86\) ## by hand or just paste it. ls /cygdrive/c/Program\ Files\ \(x86\) ## I'll not post but the listing are correct! 

Ich verstehe wirklich nicht, warum ls (1) nicht korrekt ist, wenn ich es mit $()oder mit anrufe, $var_name_hereaber trotzdem richtig ist, wenn ich den Pfad eingebe. Beachten Sie, dass der Pfad für beide Richtungen identisch ist!

Jede Hilfe hier wäre toll! Vielen Dank!

2

1 Antwort auf die Frage

2
xenoid

weil

ls $my_path; 

wird

ls /cygdrive/c/Program Files (x86) 

Da die Backslashes nicht wirklich Teil des Pfads sind, sind sie nur ein Trick in bash "Literals".

So lswird drei verschiedene Dateien Namen gegeben /cygdrive/c/Program, Filesund (x86). Um lseinen einzigen Dateinamen mit Leerzeichen anzuzeigen, verwenden Sie:

ls "$my_path" 

In der Praxis setzen Sie in Bash alle Strings in doppelte Anführungszeichen, die Leerzeichen enthalten können und die Sie als Einheit betrachten möchten. $ -subtitution findet immer noch in doppelten Anführungszeichen statt (aber nicht in einfachen Anführungszeichen)

Hallo @xenoid danke für die antwort; ich verstehe deine begründung aber es funktioniert immer noch nicht, wie du in meinem post sehen kannst, das vorletzte Beispiel enthält bereits die var in Anführungszeichen. Hast du noch eine andere Idee und nochmal danke; D n2omatt vor 7 Jahren 0
@ n2omatt Sie müssen doppelte Anführungszeichen um die Variablenreferenz haben und im Variablenwert KEINE Escape-Zeichen haben. Versuchen Sie `my_path = '/ cygdrive / c / Program Files (x86)'. ls "$ my_path" `. Dieser Oneliner, den Sie geschrieben haben, um Fluchten hinzuzufügen? Verwenden Sie es nicht, es ist ein Teil des Problems. Gordon Davisson vor 7 Jahren 2