Ich habe versucht, Dateien mit vim zu öffnen, vim $(cat filelist)
wie zuvor vorgeschlagen.Frage.
Angenommen, ich habe die folgende Datei:
~/Workspace/bar/foo.cpp
Die korrekte Ausführung von vim $(cat filelist)
öffnet , wenn enthält . Der Befehl öffnet die Datei jedoch nicht, wenn enthält . Ich möchte wissen, warum die Verwendung des absoluten Pfads dazu führt, dass der Befehl fehlschlägt.~/Workspace
foo.cpp
filelist
bar/foo.cpp
filelist
~/Workspace/bar/foo.cpp
Antwort1
Dies liegt an der Reihenfolge, in der die verschiedenen Erweiterungstypen in einer Shell ausgeführt werden. Die bash
Manpage lautet:
Die Erweiterung wird in der Befehlszeile durchgeführt, nachdem diese in Wörter aufgeteilt wurde. Es gibt sieben Arten der Erweiterung: Klammernerweiterung, Tilde-Erweiterung, Parameter- und Variablenerweiterung, Befehlsersetzung, arithmetische Erweiterung, Wortaufteilung und Pfadnamenerweiterung.
Ersetzen Sie die ~
Tilde-Erweiterung, während Sie $(...)
den Befehl ersetzen. Jetzt sehen Sie, dass nach der Befehlsersetzung keine Tilde-Ersetzung mehr erfolgt. Mit echten absoluten Pfaden (beginnend beim Stammverzeichnis des Dateisystems /
) würde es funktionieren.
Sie können die Erweiterung aber auch selbst durchführen mit sed
:
vim $(sed "s_~_${HOME}_g" filelist)