path_helperはetcディレクトリからパスをロードしません。

path_helperはetcディレクトリからパスをロードしません。

現在私はm​​acOS Catalinaを使用していますが、複数のバージョンが同じです。

/etc/zprofileまたは/etc/profile以前のバージョンでbashを使用している場合)デフォルトでは、次のものがあります。

if [ -x /usr/libexec/path_helper ]; then
    eval `/usr/libexec/path_helper -s`
fi

さらにファイルを作成しました/etc/paths.d/android。内容は

/Users/$USER/Library/Android/sdk/platform-tools
/Users/$USER/Library/Android/sdk/tools
/Users/$USER/Library/Android/sdk/tools/bin

ただし、端末を実行すると、端末は次のフォルダにバイナリを見つけることができません。

zsh: command not found: adb

理由はわかりませんが、解決策は以下のようにパスヘルパー行をコピーすることです。

if [ -x /usr/libexec/path_helper ]; then
    eval `/usr/libexec/path_helper -s`
    eval `/usr/libexec/path_helper -s`
fi

もしそうなら、私の質問は次のようになります。なぜこれが起こり、この回避策は実際にどのように機能しますか?

更新するたびに削除されるため、回避策は疲れました。


**編集する**

重複なし:

PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/VMware Fusion.app/Contents/Public:/Users/\$USER/Library/Android/sdk/platform-tools:/Users/\$USER/Library/Android/sdk/tools:/Users/\$USER/Library/Android/sdk/tools/bin:/Users/\$USER/Library/Flutter/bin:/Applications/Wireshark.app/Contents/MacOS:/Users/$USER/Library/Android/sdk/platform-tools:/Users/$USER/Library/Android/sdk/tools:/Users/$USER/Library/Android/sdk/tools/bin:/Users/$USER/Library/Flutter/bin"; export PATH;
print -lr -- $path[@]
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
/Applications/VMware Fusion.app/Contents/Public
/Users/$USER/Library/Android/sdk/platform-tools
/Users/$USER/Library/Android/sdk/tools
/Users/$USER/Library/Android/sdk/tools/bin
/Users/$USER/Library/Flutter/bin
/Applications/Wireshark.app/Contents/MacOS

重複した項目があります。

PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/VMware Fusion.app/Contents/Public:/Users/\$USER/Library/Android/sdk/platform-tools:/Users/\$USER/Library/Android/sdk/tools:/Users/\$USER/Library/Android/sdk/tools/bin:/Users/\$USER/Library/Flutter/bin:/Applications/Wireshark.app/Contents/MacOS:/Users/$USER/Library/Android/sdk/platform-tools:/Users/$USER/Library/Android/sdk/tools:/Users/$USER/Library/Android/sdk/tools/bin:/Users/$USER/Library/Flutter/bin:/Users/guness/Library/Android/sdk/platform-tools:/Users/guness/Library/Android/sdk/tools:/Users/guness/Library/Android/sdk/tools/bin:/Users/guness/Library/Flutter/bin"; export PATH;
print -lr -- $path[@]
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
/Applications/VMware Fusion.app/Contents/Public
/Users/$USER/Library/Android/sdk/platform-tools
/Users/$USER/Library/Android/sdk/tools
/Users/$USER/Library/Android/sdk/tools/bin
/Users/$USER/Library/Flutter/bin
/Applications/Wireshark.app/Contents/MacOS
/Users/guness/Library/Android/sdk/platform-tools
/Users/guness/Library/Android/sdk/tools
/Users/guness/Library/Android/sdk/tools/bin
/Users/guness/Library/Flutter/bin

答え1

解決策として、これが私がしたことです。私はまだ代替ソリューションで開いていますが、参考のためにここに私のソリューションを置きました。

if [ -x /usr/libexec/path_helper ]; then
    paths=`/usr/libexec/path_helper -s`
    eval ${paths//'\$USER'/$'$USER'}
fi

path_helperこれは、最初の呼び出しが次のようにエスケープされた文字列を使用してパス変数を生成するためです。/Users/\$USER/Libraryそして私の解決策は、評価する前にエスケープをオフにすることでした。


それでもありがとう@Gilles「だから邪悪な行動はやめなさい」問題を特定するのに役立ちます。

関連情報