web-dev-qa-db-ja.com

$ PATH変数から冗長パスを削除します

$ PATH変数に同じパスを6回定義しました。

うまく動くかどうかをチェックするためにログアウトしていませんでした。

重複を削除するにはどうすればよいですか。

$ PATH変数は次のようになります。

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

どのように私はそれをちょうどにリセットするでしょう

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

実行するだけです:

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

あなたのシステムやユーザーのニーズに合ったものであれば、いつでも.bashrc、bash.bashrc、/ etc/profileのいずれかに恒久的に変更したいのなら、それは現在のセッション用です。

108
hovanessyan

Bashを使用している場合、PATH変数からディレクトリ/home/wrong/dir/を削除したい場合は、次のようにすることもできます。

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

スクリプトを実行する前にPATH変数からパスを削除する必要がある場合は、これをスクリプトの先頭に追加します。

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

必要に応じて、リストの先頭に追加し直すことができます。

PATH=/home/user/bin:$PATH

または、リストの最後に次のように追加し直すこともできます。

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

Linux:$ PATH変数から冗長パスを削除

Linux From Scratchにはこれがあります / 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"
}

これは、パスに追加するためにこれらの関数と一緒に使用することを目的としているので、冗長にしないでください。

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"
}

簡単な使い方は、削除するディレクトリパスをpathremoveに指定することです - ただし、それは正確に一致する必要があることに注意してください。

$ pathremove /home/username/anaconda3/bin

これにより、そのディレクトリの各インスタンスがパスから削除されます。

あなたのパスにディレクトリが欲しいが、冗長性がなければ、他の関数の1つを使うことができます。 - あなたの特定の場合のために:

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

しかし、読みやすさが問題にならない限り、この時点であなたはただすることをお勧めします。

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

上記は人に知られているすべてのシェルで動作しますか?

私は上記が少なくともshdash、およびbashで動作すると思います。 cshfish', orksh`ではうまくいかないことを知って驚いたでしょう。私はそれがWindowsコマンドShellかPowershellでうまくいくかどうか疑います。

Pythonをお持ちの場合は、次のようなコマンドで直接求められていることを実行します(つまり、冗長なパスを削除します)。

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

ワンライナー(複数行の問題を回避するため):

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

上記は後で冗長なパスを削除します。以前の冗長パスを削除するには、逆リストのインデックスを使用して、もう一度逆インデックスを使用します。

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

これはPATHをクリーンアップする1行のコードです。

  • それはPATHの順序を乱すことはなく、単に重複を取り除きます。
  • 御馳走:そしてPATHを優雅に
  • 特殊文字は使用されないので、エスケープは不要です
  • /bin/awkを使用するので、PATHが壊れていても機能します。

    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

重複したパスを削除するだけの場合は、複数のPerl5/binパスで問題が発生したため、しばらく前に書いたスクリプトを使用します。

#!/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"

そして最後にそれを私の〜/ .profileに入れます。私はBASHをほとんど独占的に使用しているので、他のシェルでは試していません。

2
Kevin Nathan

Bashでは、単純に$ {var/find/replace}を使えます。

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

またはこの場合(置換ビットが空なので)、

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

私は最初にここに来たが、これをするために パラメータ展開 があるだろうと思ったので他のものに行きました。 sedよりも簡単です。

変数のプレースホルダ文字やWordをBashの別の変数の値で置き換える方法

2
sabgenton

簡単なコピー&ペーストテンプレートのために、私はこのPerlスニペットを使います:

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

この方法で代用演算子のためにスラッシュをエスケープする必要はありません。

  1. echo $PATHだけ
  2. 詳細をテキストエディタにコピーする
  3. 不要なエントリを削除する
  4. PATH= # pass new list of entries
1
ckwagaba

$PATHの値を「編集」するための標準的なツールはありません(すなわち、「まだ存在しない場合にのみフォルダを追加する」または「このフォルダを削除する」)。

次回ログインしたときのパスを確認するには、telnet localhost(またはtelnet 127.0.0.1)を使用します。それはそれからあなたのユーザ名とパスワードを尋ねます。

これはあなたに新しいログインシェル(つまり、現在の環境から何も継承しないまったく新しいもの)を提供します。

そこにある$PATHの値を確認して、正しい値になるまでrcファイルを編集できます。これは、重要なファイルを変更した後にもう一度ログインできるかどうかを確認するのにも役立ちます。

0
Aaron Digulla

これらの重複したパスをPATH変数にどのように追加しましたか? .ファイルの1つを編集したはずです。 (あなたの特定のシステム/シェルに応じて.tcshrc.bashrcなど)。これを修正する方法は、ファイルを再度編集して重複したパスを削除することです。

あなたがしていないファイルを編集していて、あなたがPATHを対話的に修正したに違いない場合。その場合、変更は「固執」しません。つまり、別のシェルを開いたり、ログアウトして再度ログインした場合、変更は自動的に失われます。

システム全体の設定ファイルもありますが、それらを変更することはまずありません。おそらく、個人のホームディレクトリ内のファイルを変更することになります(一連のパスを確定した後でそれらの変更を永続的にする場合)。

0
Levon

あなたのシェルがBashであると仮定すると、あなたは次のようにパスを設定することができます。

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

しかしレボンが別の答えで言ったように、あなたがシェルを終了するとすぐに変更は消えます。あなたはおそらくPATH~/.bash_profileまたは~/.bashrcに設定したいでしょう。

0
Leo