2016-09-20 1 views
1

Dies ist auf OSX El Capitan, sondern passiert auch in meinem Ubuntu-Aliase.verschiedene Auswertung von pwd in ~ /. Bash_profile Alias ​​je nach Art des Zitats

Ich stieß auf ein Problem mit einem Alias, den ich erstellt habe, um das Arbeitsverzeichnis an einen Andock-Container zu übergeben.

dies nicht funktionieren (immer passiert ~/Users/username für $ (PWD), egal in welchem ​​Verzeichnis Ich bin in):

alias phpqa="docker run --rm -u $UID -v $(pwd):/app eko3alpha/docker-phpqa" 

Werke:

alias phpqa='docker run --rm -u $UID -v $(pwd):/app eko3alpha/docker-phpqa' 

Allerdings begann ich immer unerwartete Fehler in meinem Skript, wenn der falsche Pfad übergeben wurde. Also habe ich ein Experiment gemacht. Ich habe diese beiden Aliase in mein ~/.bash_profile eingefügt.

alias getpath="echo $(pwd)" 
alias getpath2='echo $(pwd)' 

ich abgemeldet und dann angemeldet zurück

Verzeichnis wechseln.

$ cd /Users/username/correct/path/to/project 

beiden Aliase ausführen:

$ getpath 
/Users/username 

$ getpath2 
/Users/username/correct/path/to/project 

die Alias ​​mit den doppelten Anführungszeichen immer wieder die Benutzer home-Verzeichnis, während der Alias ​​mit einfachen Anführungszeichen das aktuelle Verzeichnis zurückgibt. Kann jemand erklären, warum das so ist?

+0

Suche ist ein nützliches Wissen. http://stackoverflow.com/questions/6697753/difference-between-single-and-double-quotes-in-bash –

+0

Wenn einzelne Anführungszeichen literal waren, warum bekomme ich dann nicht "echo $ (pwd)", wenn ich ausführen " getpath2 ", die in einfache Anführungszeichen eingeschlossen ist. Stattdessen erhalte ich "/ Benutzer/Benutzername/richtig/path/to/Projekt" – Eko3alpha

+0

Es ist einfach, versuchen Sie sich: echo "echo $ (PWD)" uuuuund echo 'echo $ (pwd)' den Unterschied fühlen? –

Antwort

4

Die Aliasdefinition wird wie jeder andere Befehl analysiert. Innerhalb von Anführungszeichen werden variable Ersetzungen wie $UID und Befehlsersetzungen wie $(pwd) erweitert. In einfachen Anführungszeichen wird nichts erweitert: Das einzige Sonderzeichen ist ein einfaches Anführungszeichen, das das literale Wort mit einem Anführungszeichen beendet.

alias phpqa="docker run --rm -u $UID -v $(pwd):/app eko3alpha/docker-phpqa" 

Unter der Annahme, dass die Benutzer-ID 1000 und das aktuelle Verzeichnis ist Ihr Home-Verzeichnis /Users/username zu der Zeit Ihres .bash_profile gelesen wird, das die Alias ​​phpqa mit der Erweiterung definiert docker run --rm -u 1000 -v /Users/username:/app eko3alpha/docker-phpqa.

alias phpqa='docker run --rm -u $UID -v $(pwd):/app eko3alpha/docker-phpqa' 

Dies definiert den Alias ​​phpqa mit der Expansion docker run --rm -u $UID -v $(pwd):/app eko3alpha/docker-phpqa. Jedes Mal, wenn der Alias ​​erweitert wird, wird er durch die entsprechende Zeichenfolge ersetzt, und diese Zeichenfolge unterliegt der üblichen Shell-Parsing-Regel. Daher wird bei jeder Verwendung des Alias ​​der aktuelle Wert der Variablen UID verwendet und der Befehl pwd ausgeführt.

Die richtige Definition dieses Alias ​​würde

alias phpqa='docker run --rm -u "$UID" -v "$PWD:/app" eko3alpha/docker-phpqa' 

Always use double quotes around variable and command substitutions unless you know that you need to omit them sein. $PWD und $(pwd) sind gleichwertig (die Shell verfolgt das aktuelle Verzeichnis in der Variablen PWD).

Alternativ, vergessen Sie nicht zu zitieren (außer doppelte Anführungszeichen um Substitutionen) und verwenden Sie eine Funktion.

phpqa() { 
    docker run --rm -u "$UID" -v "$PWD:/app" eko3alpha/docker-phpqa "[email protected]" 
} 
+0

Das würde erklären, warum ich mein Heimverzeichnis vs Arbeitsverzeichnis je nach den Arten von Anführungszeichen bekam. Ich danke Ihnen für Ihre Erklärung! – Eko3alpha

+0

Die Funktion sollte am Ende "$ @" haben, um zusätzliche Argumente zu übergeben (wie der Alias). –

+0

@ Eko3alpha, ... übrigens, Gilles hat beim Schreiben der Funktionsversion tatsächlich eine Reihe von Fehlern in Ihrem Alias ​​behoben - das funktioniert zum Beispiel in Verzeichnissen, die Leerzeichen in Ihren Namen haben; Wird eine leere Zeichenfolge explizit an "docker run" übergeben, wenn "UUID" nicht definiert ist, anstatt "-u -v" auszuführen (wodurch eine bessere Fehlermeldung angezeigt wird); und es ist auch effizienter, da es keine unnötige Subshell hervorbringt, um 'pwd' auszuführen. Du solltest die Funktion wirklich nutzen. –

0

Die $(pwd) ausgewertet wird, wenn die Alias ​​ erstellt, wenn der Alias ​​doppelte Anführungszeichen verwendet:

$ alias getpath="echo $(pwd)" 
$ alias getpath 
alias getpath='echo /Users/username' 
$ cd path/to/project 
$ getpath 
/Users/username 

Die $(pwd) wird ausgewertet, wenn die Alias ​​ verwendet wird, wenn die Alias ​​einfache Anführungszeichen verwendet:

$ alias getpath='echo $(pwd)' 
$ alias getpath 
alias getpath='echo $(pwd)' 
$ cd path/to/project 
$ getpath 
/Users/username/path/to/project 
Verwandte Themen