it-swarm.com.de

Entfernen Sie redundante Pfade aus der Variablen $ PATH

Ich habe den gleichen Pfad in der Variablen $ PATH 6 Mal definiert.

Ich habe mich nicht abgemeldet, um zu überprüfen, ob es funktioniert hat.

Wie kann ich die Duplikate entfernen?

Die Variable $ PATH sieht folgendermaßen aus:

echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin:/home/flacs/Programmes/USFOS/bin

Wie würde ich es nur zurücksetzen

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
119
charles hendry

Sie führen gerade aus:

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

dies gilt für die aktuelle Sitzung, wenn Sie sie dauerhaft ändern möchten und sie zu einer beliebigen .bashrc-, bash.bashrc- oder/etc/-Profildatei hinzufügen möchten.

111
hovanessyan

Wenn Sie Bash verwenden, können Sie auch Folgendes tun, wenn Sie beispielsweise das Verzeichnis /home/wrong/dir/ Aus Ihrer PATH -Variablen entfernen möchten:

PATH=`echo $PATH | sed -e 's/:\/home\/wrong\/dir\/$//'`
63
sufinawaz

Wenn Sie vor der Ausführung Ihres Skripts einen Pfad aus der Variablen PATH entfernen müssen, fügen Sie diesen am Anfang des Skripts hinzu:

PATH=$(echo $PATH | sed -e 's;:\?/home/user/bin;;' -e 's;/home/user/bin:\?;;')

Wenn Sie es brauchen, können Sie es am Anfang der Liste erneut hinzufügen:

PATH=/home/user/bin:$PATH

Oder Sie fügen es am Ende der Liste erneut hinzu mit:

PATH=$PATH:/home/user/bin
14
Alex Jolig

Linux: Entfernen Sie redundante Pfade aus der Variablen $ PATH

Linux From Scratch hat diese Funktion in/etc/profile

# Functions to help us manage paths.  Second argument is the name of the
# path variable to be modified (default: PATH)
pathremove () {
        local IFS=':'
        local NEWPATH
        local DIR
        local PATHVARIABLE=${2:-PATH}
        for DIR in ${!PATHVARIABLE} ; do
                if [ "$DIR" != "$1" ] ; then
                  NEWPATH=${NEWPATH:+$NEWPATH:}$DIR
                fi
        done
        export $PATHVARIABLE="$NEWPATH"
}

Dies soll mit diesen Funktionen zum Hinzufügen zum Pfad verwendet werden, damit Sie es nicht redundant ausführen:

pathprepend () {
        pathremove $1 $2
        local PATHVARIABLE=${2:-PATH}
        export $PATHVARIABLE="$1${!PATHVARIABLE:+:${!PATHVARIABLE}}"
}

pathappend () {
        pathremove $1 $2
        local PATHVARIABLE=${2:-PATH}
        export $PATHVARIABLE="${!PATHVARIABLE:+${!PATHVARIABLE}:}$1"
}

Die einfache Verwendung besteht darin, pathremove den zu entfernenden Verzeichnispfad anzugeben. Beachten Sie jedoch, dass der Pfad genau übereinstimmen muss:

$ pathremove /home/username/anaconda3/bin

Dadurch wird jede Instanz dieses Verzeichnisses aus Ihrem Pfad entfernt.

Wenn Sie das Verzeichnis in Ihrem Pfad haben möchten, jedoch ohne die Redundanzen, können Sie einfach eine der anderen Funktionen verwenden, z. - für Ihren speziellen Fall:

$ pathprepend /usr/local/sbin
$ pathappend /usr/local/bin
$ pathappend /usr/sbin
$ pathappend /usr/bin
$ pathappend /sbin
$ pathappend /bin
$ pathappend /usr/games

An dieser Stelle ist es jedoch besser, nur Folgendes zu tun, es sei denn, die Lesbarkeit ist das Problem:

$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Würde das oben Genannte in allen dem Menschen bekannten Schalen funktionieren?

Ich würde davon ausgehen, dass das oben Genannte zumindest in sh, dash und bash funktioniert. Ich wäre überrascht zu erfahren, dass es in csh, fish', or Ksh` nicht funktioniert. Ich bezweifle, dass es in Windows Command Shell oder Powershell funktionieren würde.

Wenn Sie Python haben, sollte die folgende Art von Befehl tun, was direkt gefragt wird (das heißt, redundante Pfade entfernen):

$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')
print(':'.join(sorted(set(path), key=path.index)))
" )

Ein Einzeiler (um mehrzeilige Probleme zu umgehen):

$ PATH=$( python -c "import os; path = os.environ['PATH'].split(':'); print(':'.join(sorted(set(path), key=path.index)))" )

Das Obige entfernt später redundante Pfade. Um frühere redundante Pfade zu entfernen, verwenden Sie den Index einer umgekehrten Liste und kehren Sie ihn erneut um:

$ PATH=$( python -c "
import os
path = os.environ['PATH'].split(':')[::-1]
print(':'.join(sorted(set(path), key=path.index, reverse=True)))
" )
10
Aaron Hall

Hier ist ein einzeiliger Code, der den Pfad aufräumt

  • Die Reihenfolge des PFADS wird nicht gestört, lediglich Duplikate werden entfernt
  • Leckereien: und PATH anmutig entleeren
  • Es werden keine Sonderzeichen verwendet, sodass kein Escape erforderlich ist
  • Verwendet /bin/awk so funktioniert es auch wenn PATH kaputt ist

    export PATH="$(echo "$PATH" |/bin/awk 'BEGIN{RS=":";}
    {sub(sprintf("%c$",10),"");if(A[$0]){}else{A[$0]=1;
    printf(((NR==1)?"":":")$0)}}')";
    
7
GreenFox

Wenn Sie nur doppelte Pfade entfernen möchten, verwende ich dieses Skript, das ich vor einiger Zeit geschrieben habe, da ich Probleme mit mehreren Perl5/bin-Pfaden hatte:

#!/bin/bash
#
# path-cleanup
#
# This must be run as "source path-cleanup" or ". path-cleanup"
# so the current Shell gets the changes.

pathlist=`echo $PATH | sed 's/:/\n/g' | uniq`

# echo "Starting PATH: $PATH"
# echo "pathlist: $pathlist"
unset PATH
# echo "After unset, PATH: $PATH"
for dir in $pathlist
do
    if test -d $dir ; then
        if test -z $PATH; then
            PATH=$dir
        else
            PATH=$PATH:$dir
        fi
    fi
done
export PATH
# echo "After loop, PATH: $PATH"

Und ich habe es am Ende in mein ~/.profile gestellt. Da ich BASH fast ausschließlich benutze, habe ich es nicht in anderen Shells ausprobiert.

2
Kevin Nathan

In bash kannst du einfach $ {var/find/replace}

PATH=${PATH/%:\/home\/wrong\/dir\//}

Oder in diesem Fall (da das Ersetzungsbit leer ist) einfach:

PATH=${PATH%:\/home\/wrong\/dir\/}

Ich kam zuerst hierher, ging aber zu einer anderen Ware, da ich dachte, dass es eine Parametererweiterung geben würde, um dies zu tun. Einfacher als sed !.

Wie ersetze ich ein Platzhalterzeichen oder Word in einer Variablen durch einen Wert aus einer anderen Variablen in Bash?

2
sabgenton

Für eine einfache Kopiervorlage verwende ich dieses Perl-Snippet:

PATH=`echo $PATH | Perl -pe s:/path/to/be/excluded::`

Auf diese Weise müssen Sie den Schrägstrichen für den Ersatzoperator nicht entgehen.

  1. Gerade echo $PATH
  2. kopieren Sie Details in einen Texteditor
  3. entfernen Sie unerwünschte Einträge
  4. PATH= # pass new list of entries
1
ckwagaba

Es gibt keine Standardwerkzeuge zum "Bearbeiten" des Werts von $PATH (D. H. "Ordner nur hinzufügen, wenn er noch nicht vorhanden ist" oder "Diesen Ordner entfernen").

Verwenden Sie telnet localhost (Oder telnet 127.0.0.1), Um zu überprüfen, wie der Pfad lauten würde, wenn Sie sich das nächste Mal anmelden. Anschließend werden Sie nach Ihrem Benutzernamen und Passwort gefragt.

Dies gibt Ihnen eine neue Login-Shell (d. H. Eine völlig neue, die nichts von der aktuellen Umgebung erbt).

Sie können dort den Wert von $PATH Überprüfen und Ihre RC-Dateien bearbeiten, bis sie korrekt sind. Dies ist auch hilfreich, um festzustellen, ob Sie sich nach einer Änderung an einer wichtigen Datei erneut anmelden können.

0
Aaron Digulla

Wie haben Sie diese doppelten Pfade zu Ihrer PATH-Variablen hinzugefügt? Sie müssen eine Ihrer . - Dateien bearbeitet haben. (.tcshrc Oder .bashrc Usw., je nach System/Shell). Sie können das Problem beheben, indem Sie die Datei erneut bearbeiten und die doppelten Pfade entfernen.

Wenn Sie nicht Dateien bearbeiten und Sie müssen den PFAD interaktiv geändert haben. In diesem Fall bleiben die Änderungen nicht erhalten, dh wenn Sie eine andere Shell öffnen oder sich abmelden und wieder anmelden, werden die Änderungen automatisch übernommen.

Beachten Sie, dass es auch einige systemweite Konfigurationsdateien gibt, aber es ist unwahrscheinlich, dass Sie diese geändert haben. Daher werden Sie höchstwahrscheinlich Dateien in Ihrem persönlichen Ausgangsverzeichnis ändern (wenn Sie diese Änderungen dauerhaft übernehmen möchten, sobald Sie sich für eine Reihe von Pfaden entschieden haben).

0
Levon

Angenommen, Ihre Shell ist Bash, können Sie den Pfad mit festlegen

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

aber wie Levon in einer anderen Antwort sagte, werden die Änderungen verschwunden sein, sobald Sie die Shell beenden. Sie möchten wahrscheinlich Ihr PATH in ~/.bash_profile Oder ~/.bashrc Einrichten.

0
Leo