2016-07-25 5 views
1

Ich habe seit einiger Zeit versucht, eine Funktion für mein Bash-Profil zu schreiben. Das Problem, das ich zu überwinden versuche, ist, dass ich normalerweise mit Dateipfaden versehen bin, die Leerzeichen enthalten, und es ist ein Schmerz, durch alle Räume zu gehen, bevor ich versuche, es im Terminal zu öffnen.BASH-Funktion zum Entfernen von Leerzeichen in Dateinamen vor dem Öffnen

z.B. Datei ->/Bände/Unternehmen/Illustratoren/Website Front Page Design.ai

Was ich versuche zu beenden ist '/ Bände/Unternehmen/Illustratoren/Website \ Front \ Page \ Design.ai' sein geöffnet von meinem Terminal.

Bis jetzt habe ich es geschafft, die Leerzeichen zu entkommen, aber ich bekomme dann den Fehler "Die Datei ..... existiert nicht."

Mein Code so weit ist

function opn { open "${1// /\\ }";} 

Jede Hilfe sehr geschätzt würde.

+3

Gibt es etwas falsches über 'öffnen" meinen Dateinamen "' oder 'öffnen" $ filename "'? – Kusalananda

+2

Im Allgemeinen ist die Flucht aus Räumen Doing It Wrong. Wenn Sie korrekt angeben, benötigen Sie keine literalen Escapes in Ihren Daten. –

+1

Übrigens ist das Schlüsselwort 'function' eine Nicht-POSIX-Syntax. Betrachten Sie stattdessen Ihre Funktionen als 'opn() {open $ @"; } ', ohne führende' Funktion', um mit einer größeren Anzahl von Schalen kompatibel zu sein. –

Antwort

4

Die wichtige Sache zu verstehen ist der Unterschied zwischen Syntax und wörtliche Daten.

Bei korrekter Ausführung lautet die Escape-Nummer Syntax: Es wird von der Shell gelesen und verworfen. Das heißt, wenn Sie

open "File With Spaces" 

oder

open File\ With\ Spaces 

oder sogar

open File" "With\ Spaces 

laufen ... die Quotierung und entweicht durch die Schale analysiert und entfernt, und das eigentliche Betriebssystem Aufruf, der ausgeführt wird, ist das:

execv("/usr/bin/open", "open", "File With Spaces") 

Beachten Sie, dass in den Argumenten von syscall keine umgekehrten Schrägstriche (oder Literalzitate) enthalten sind! Wenn Sie wörtliche Schrägstriche in Ihrer Daten setzen, dann führen Sie diese ausgeführt werden:

/* this is C syntax, so "\\" is a single-character backslash literal */ 
execv("/usr/bin/open", "open", "File\\ With\\ Spaces") 

... und es sei denn, es gibt eine Datei mit Schrägstriche in ihrem Namen, das funktioniert einfach nicht, was die " Datei existiert nicht "Fehler, den Sie melden.


So - rufen Sie einfach offen mit Ihrem Namen in Anführungszeichen:

open "$1" 

... dort für einen opn wrappper keine Notwendigkeit.

+0

Vielen Dank für Ihre Antwort, nicht nur hat Ihre Lösung funktioniert, aber es hat offensichtlich die Notwendigkeit, eine separate Funktion vollständig zu erstellen negiert. – MCMXCII

0

Leerzeichen sind in Dateinamen problematisch, da sie Teil von bash 's Standard IFS (Interner Feldtrenner) sind, der zum Trennen von Token in einer Befehlszeile verwendet wird. Das bedeutet, dass standardmäßig der Befehl command an argument with spaces 4 Argumente anstelle von 1 mit Leerzeichen erhält.

Ich vermute, Sie haben Ihre opn Funktion in der gleichen Weise aufgerufen, so dass nur der erste Teil Ihres Pfades als $1.

Hoffentlich ist die Reparatur einfach: umschließen Sie Ihren Pfad in Anführungszeichen, so dass bash die Leerzeichen nicht interpretiert. Wenn Sie dies verwenden, verschwindet die Notwendigkeit für Ihre opn Funktion: open "/Volumes/Company/Illustrators/Website Front Page Design.ai" sollte gut funktionieren.

+0

'open' ist ein Befehl auf MacOS, keine benutzerdefinierte Funktion. –

+0

Sie haben die Leerzeichen zweimal ausgeblendet: einmal mit dem Backslash und einmal mit den umschließenden Anführungszeichen. – chepner

+0

@CharlesDuffy Ich spreche über OP '' opn' Funktion – Aaron