Weisen Sie $pwd der Variablen $PATH bedingt zu

Weisen Sie $pwd der Variablen $PATH bedingt zu

Ich möchte mein aktuelles Arbeitsverzeichnis mit seinen projektspezifischen binVerzeichnissen zu meinem $PATH hinzufügen, wenn die Verzeichnisse vorhanden sind.

Also fügte ich diese Zeilen zu meinem.zshrc:

[ -d "$(pwd)/vendor/bin" ] && export PATH="$(pwd)/vendor/bin":"$PATH"
[ -d "$(pwd)/node_modules/.bin" ] && export PATH="$(pwd)/node_modules/.bin":"$PATH"

Die oberen Pfade werden vorangestellt, wenn ich die Befehle manuell in das Terminal einfüge, sonst jedoch nicht. Das $PATHist das gleiche wie vorher. Ich habe auch verschiedene Schreibweisen ausprobiert, wie "${PATH}"und die zsh- pathFunktion. Sie funktionieren alle, wenn sie manuell eingefügt werden, aber nicht, wenn sie sich innerhalb des.zshrcDatei.

--

Ich bin dabeimacOS High Sierra v10.13.6mit demStandardterminalund mitzsh v5.7.1.

Antwort1

Konkret zshkönnten Sie Folgendes tun:

path[1,0]=( ~/projects/{vendor/,node_modules/.}bin(/N) )

Wo:

path[1,0]=( list )

fügt listam Anfang des Arrays ein ( $pathin zshist ein angebundenes Array $PATHwie in csh).

und (N/)ist ein Glob-Qualifizierer, der den Glob Naktiviert nullglobund /Dateien vom Typ Verzeichnis auswählt, sodass diese beiden Dateien vor dem $PATHHinzufügen hinzugefügt werden, sofern sie vorhanden sind und vom Typ sindVerzeichnis.

pwdist der Befehl, der pdas aktuelle Arbeitsverzeichnis (den Inhalt der Variable) druckt w. dEs $PWDwäre nur sinnvoll $(pwd), oder eher $PWDin Ihrem zu verwenden, wenn Sie Verzeichnisse bedingt zu dem .zshrchinzufügen möchten, von dem aus gestartet wird. Aber selbst dann wäre das gefährlich, denn wenn Sie beispielsweise von oder dem Verzeichnis einer anderen Person gestartet sind, könnte jemand dort schädliche Dateien platziert haben, die Standardbefehle wie oder außer Kraft setzen .$PATHzshzsh/tmplsrm

Antwort2

ich glaube nicht, dass es möglich ist, das so zu machen, wie Sie es möchten, nicht mit .rc (.rc wird nur einmal ausgeführt, es wird später nicht mehr ausgeführt, es sei denn, Sie tun es ausdrücklich). Aber was ist mit zwei Aliasen?

backupPATH=$PATH
function mkpath {
    [ -d "$(pwd)/vendor/bin" ] && export PATH="$(pwd)/vendor/bin":"$PATH"
    [ -d "$(pwd)/node_modules/.bin" ] && export PATH="$(pwd)/node_modules/.bin":"$PATH"
}
alias resetpath="PATH=$backupPATH"

Damit können Sie Ihr aktuelles Verzeichnis jederzeit zum $PATH hinzufügen.

Antwort3

Wie andere bereits angemerkt haben, funktioniert Ihr Code nicht unbedingt wie erwartet, wenn Sie ein neues Terminal öffnen, da das aktuelle Arbeitsverzeichnis möglicherweise nicht dasjenige ist, das Ihre Projekte enthält, und dieser Codeabschnittnurwird ausgeführt, wenn eine neue Shell gestartet wird.

Stattdessen wissen Sie vermutlich, wo sich Ihre Projekte befinden, möglicherweise in Bezug auf Ihr $HOMEVerzeichnis. Wenn ja, können Sie stattdessen Folgendes verwenden:

for binpath in vendor/bin node_modules/.bin; do
    if [ -d "$HOME/projects/$binpath" ]; then
        PATH=$HOME/projects/$binpath:$PATH
    fi
done

export PATH

Ich gehe davon aus, dass $HOME/projectssich Ihre Projekte dort befinden.

Das exportam Ende ist wahrscheinlich nicht erforderlich, da PATHes wahrscheinlich bereits exportiert wurde.

verwandte Informationen