ファイルのPATH変数は私が見ることができるようにかなり長いので、読みやすくするために複数行に分割しました。ここ。これが私が変えたものです/etc/profile
:
# PATH="/usr/share/python-wheels:/usr/share/gcc/python/usr/lib/python3/dist-pa>
# PATH="/usr/share/doc:/usr/lib/python3:/usr/lib/python3/dist-packages:/usr/lib/cups/backend:usr/lib/python3.11:/usr/src/python3.11:/sbin:/bin"
path+=(
/usr/local/bin
/usr/bin
/bin
/usr/local/games
/usr/games
/home/lm/local/pipx/venvs/esptool
/usr/share/python-wheels
/usr/share/gcc/python
/usr/lib/python3/dist-packages/pip/_vendor/pygments/lexers
/usr/share/doc
/usr/lib/python3
/usr/lib/python3/dist-packages
/usr/lib/cups/backend
/usr/lib/python3.11
/usr/src/python3.11
/sbin
/bin
)
export PATH
それから私は走った。
source ~/.profile
何もecho $PATH
変わりませんでした。
root@debian:/home/lm# echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/lm/.local/bin:/root/.local/bin:/root/.local/bin:/root/.local/bin:/root/.local/bin:/root/.local/bin
root@debian:/etc/default# source /etc/profile
root@debian:/etc/default# echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/home/lm/.local/bin:/root/.local/bin
PATHは、XFCEが再起動または再起動された後もデフォルトのままです。
問題は何であり、新しいPATH設定が許可されるようにこの問題をどのように解決できますか?
私のシステムはDebian 12とXFCEです。
答え1
まず、bashを使用するとpath
問題になりません。 BashのみPATH
。これで、読みやすくするためにシェル構成ファイルをフォーマットするには、次のようにします。
path_dirs=(
/usr/local/bin
/usr/bin
/bin
/usr/local/games
/usr/games
/home/lm/local/pipx/venvs/esptool
/usr/share/python-wheels
/usr/share/gcc/python
/usr/lib/python3/dist-packages/pip/_vendor/pygments/lexers
/usr/share/doc
/usr/lib/python3
/usr/lib/python3/dist-packages
/usr/lib/cups/backend
/usr/lib/python3.11
/usr/src/python3.11
/sbin
/bin
)
for path in "${path_dirs[@]}"; do
PATH="$PATH:$path"
done
export PATH
path_dirs
これは、必要なものを格納する配列を作成し、配列を繰り返し、PATH
各項目をPATH
。
ディレクトリにスペースが含まれている場合は、引用符で囲む必要があります。
path_dirs=(
...
"/some/path/with a space/"
...
)
また、名前に改行文字を含むディレクトリを追加することはできませんが、私が知っている限り、とにかくそれを行うことはできません。
pathmunge
最後に、Red Hat / Fedoraシステムで提供されている同様の機能を使用したい場合があります。とにかく約20年間使ってきましたが、~/.profile
とても便利です。
pathmunge () {
if ! echo $PATH | /bin/grep -Eq "(^|:)$1($|:)" ; then
if [ "$2" = "after" ] ; then
PATH=$PATH:$1
else
PATH=$1:$PATH
fi
fi
}
この関数はパスにすでに何かがあるかどうかを確認し、そうでない場合は変数の先頭または末尾に追加しますPATH
。関数をファイルに貼り付けて、~/.profile
次を実行できます。
## add a directory to the beginning of the path (prepend)
pathmunge /some/dir after
## add a directory to the end of the path (append)
pathmunge /some/dir
つまり、次~/.profile
のように変更できます。
for path in "${path_dirs[@]}"; do
pathmunge "$path" after
done
答え2
path
PATH
本質的に同じではありません。
また、/ etc / profileの内容は実際には/ bin / shと互換性がなければなりませんが、そうではありません。これらのどれもあなたの意志にならないと思います。以下を試してください。お持ちのコードをコピーしてsh
端末で実行し、コードを貼り付けて$path
「$PATH$」を確認してください。
答え3
「コロンで区切られた」リスト(PATH
たとえば)で作業するとき、私は2000年のLinux Journalで説明されているStephen Collyerのbash_path_funcsを使用します。
https://www.linuxjournal.com/article/3645 https://www.linuxjournal.com/article/376 8 https://www.linuxjournal.com/article/3935
addpath
この関数は、最初にそのエントリがパスに存在しない場合にのみパスにエントリを追加します。delpath -n
パスに存在しないディレクトリを削除します。listpath
パスを一覧表示します。
pathfunc.tgz
からファイルを受け取ることができます。https://web.archive.org/web/20061210054813/http://www.netspinner.co.uk:80/Downloads/pathfunc.tgz
答え4
あなたのコードはzsh専用です。/etc/profile
システム全体に適用されます(したがって、すべてのユーザーに適用されます)会議呼び出し時にBourneに似たシェルによって解釈される初期化ファイルログインshell(0番目の引数の最初の文字)。-
zsh
それ自体は、0番目の引数として呼び出されたときのように、またはシミュレートされたsh
ときにのみ読み取られます。ksh
-sh
-ksh
したがって、ファイルはsh
文法的でなければなりません。 POSIXsh
構文は、Bourneシェルを持つシステムを除いては大丈夫です。しかし、最近ではそのような場合が非常にまれです。
しかし、今日のログインセッションはグラフィカルな方法であり、環境の設定には/etc/profile
ほとんど使用されません。~/.profile
あなたは~/.xsession
またはそのようなことで~/.xinitrc
より多くの幸運を楽しむことができます~/.pam_environment
。
POSIX sh構文に要素を追加するには、$PATH
次の関数を定義できます。
add_to_PATH() for _dir do
case ":$PATH:" in
(*:"$_dir":*) ;; # already there
(*) PATH="$PATH${PATH:+:}$_dir";;
esac
done
add_to_PATH \
/my/dir \
/my/other/dir \
...
構文はzsh
bash互換(明らかにより簡単な方法があるにもかかわらずzsh
)とbash
-bash互換(ほとんどのPOSIXコードは標準との偏差がはるかに少ないsh
ためbash互換)なので、コードはどちらか一方で読むことができます。 shell すべてのPOSIX互換シェルも同様です。bash
zsh
Bourneと互換性がない唯一のものは(*:"$_dir":*)
andであり、これをand(*)
に変更する必要があります(Bourneシェルの以前のバージョンでは元のcshのみがサポートされました(80年代半ばまで))。*:"$_dir":*)
*)
# comments