重複するパス、.bash_profileの問題

Aug 16 2020

PyExifToolを機能させるのに苦労していることについて質問を投稿した後、 StackOverflowからここに誘導されました。しかし、問題は多面的であり、初心者であるため、ここで助けを求めるように言われたようです。

本質的に、私が走るように言われたとき、問題は実現しました...

bash:~ $ type -all exiftool

戻ってきた...

exiftool is /usr/local/bin/exiftool
exiftool is /usr/local/bin/exiftool

...どこかに重複があったことを明らかにしました。

続いて、私は走った...

bash:~ $ echo $PATH

戻ってきた...

/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profile

...重複が含まれており、明らかにで終わるべきではありません .bash_profile

ターミナルで、これを使用してクリーンアップできます...

bash:~ $ PATH=$(echo $PATH | awk -v RS=: -v ORS=: '!($0 in a) {a[$0]; print}')

上記は、Linux Journalから取得した「ほぼ機能する」はずのスニペットですが、「機能するはずの」コードは役に立たないようです。'ほぼ機能する'コードを使用すると、次のようになります。

/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profile :

私はまったくの初心者ですが、それで終わるはずはないと思いますし :、明らかに.bash_profileまだ存在しています。ただし、重複を削除しているように見えますが、新しいターミナルウィンドウを開くとリセットされるため、これは緊急の回避策にすぎません。

これは私のbashプロファイルがどのように見えるかです:

export PATH=/usr/local/bin:$PATH~/.bash_profile # Setting PATH for Python 3.6 # The original version is saved in .bash_profile.pysave #PATH="/Library/Frameworks/Python.framework/Versions/3.6/bin:${PATH}"
#export PATH

# Setting PATH for Python 2.7
# The original version is saved in .bash_profile.pysave
#PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}" #export PATH # FSL Setup FSLDIR=/usr/local/fsl PATH=${FSLDIR}/bin:${PATH} export FSLDIR PATH . ${FSLDIR}/etc/fslconf/fsl.sh


# Setting PATH for Python 3.8
# The original version is saved in .bash_profile.pysave
PATH="/Library/Frameworks/Python.framework/Versions/3.8/bin:${PATH}"
export PATH

これが関連しているか関連しているかはわかりませんが、ホットバーからpythonを起動して実行すると...

>>> print(os.environ['PATH'])

印刷します

/usr/bin:/bin:/usr/sbin:/sbin

一方、bashターミナルから起動すると、次のIDLE3ようになります。

/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profile

周辺情報と実験:

FSLをインストールするときに何かを台無しにし、何かをして.bash_profile、基本的なコーディングスキルを習得して開発しようとしているときに悩まされていると思います。おそらくそれは手動エラーであったか、自作またはXcodeと関係があったのかもしれません。

.bash_profileエンディングを削除することはできますが、すでに十分なダメージを与えており、問題のトラブルシューティングをしたくないので、インターネットフォーラムがそれに触れたくないので面倒です。

これは、LinuxJournalのMitchFrazierによると機能するはずだったものです。明らかに、これは彼や記事への反映ではなく、私の限られた理解への反映です。

bash:~ $ export PATH=/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profile
bash:~ $ echo -n $PATH | awk -v RS=: '!($0 in a) {a[$0]; printf("%s%s", length(a) > 1 ? ":" : "", $0)}'

これは戻ります...

/Library/Frameworks/Python.framework/Versions/3.8/bin:/usr/local/fsl/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin~/.bash_profileUser's-MBP:~ username$

私も以下を試しました(pepa65が提案)...

bash:~ $ PATH=$(n= IFS=':'; for e in $PATH; do [[ :$n == *:$e:* ]] || n+=$e:; done; echo "${n:0: -1}")

これは戻ります...

-bash:  -1: substring expression < 0

を使用して変更を検索しようとするとecho $PATH...

空白行が表示されます。

これが知的に刺激的である可能性は低いことを私は知っているので、私はどんな助けにも感謝しています。

編集1:

.bash_profile私の最初の行の終わりから削除しようとした素朴な試み.bash_profileは、出力がecho $PATH変更されていないまま消えることはありませんでした。

回答

tripleee Aug 16 2020 at 14:21

.bash_profileこれは、構成に適切であると思われる縮小および修正されたものです。

最初に問題のある行があり~/.bash_profile、それ以外の場合は正しい行に誤って追加されていました。ただし、予想どおりに行全体を削除しました。診断によると、すでにシステム提供のデフォルトにあるディレクトリが追加されていたことがわかりますPATH

間違いなくexport PATH2回以上する必要はありません。おそらく、残りの1つのインスタンスでも安全に削除できます。の意味は、サブプロセスに表示exportされる環境変数にする変数をマークすることです。これを行うと、値がexport。の後に変更された場合でも、サブプロセスは変数の現在の値にアクセスできるようになります。おそらく、システム全体のシェル構成がPATH変数に対してこれをすでに実行しています(そうでない場合、意図したとおりに機能しませんでした)。

コメントアウトされたセクション全体を削除しました。もちろん、それらを元に戻し、コメントを解除することもできます。

# FSL Setup
FSLDIR=/usr/local/fsl
PATH=${FSLDIR}/bin:${PATH}
export FSLDIR PATH
. ${FSLDIR}/etc/fslconf/fsl.sh # Setting PATH for Python 3.8 # The original version is saved in .bash_profile.pysave PATH="/Library/Frameworks/Python.framework/Versions/3.8/bin:${PATH}"

このファイルは、新しいシェルを起動したときに読み取られますが、正確には、OSベンダーがBashをどのように構成したかによっても異なります。古い構成が現在の構成に干渉していないことを完全に確認するには、最初からやり直すためにログアウトして再度ログインする必要があるかどうか、または単に新しいシェルまたは新しいターミナルセッションを開始できるかどうかを確認する必要があります。きれいな状態になります。

おそらく.bash_profile.pysave、保持したい有用なものが含まれているかどうかをまだ確認しますが、最後の行のセットを除いて、現在のバージョンとほぼ同じであると思います。