PATH変数を複数行に分割

PATH変数を複数行に分割

ファイルの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

pathPATH本質的に同じではありません。

また、/ 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 \
  ...

構文はzshbash互換(明らかにより簡単な方法があるにもかかわらずzsh)とbash-bash互換(ほとんどのPOSIXコードは標準との偏差がはるかに少ないshためbash互換)なので、コードはどちらか一方で読むことができます。 shell すべてのPOSIX互換シェルも同様です。bashzsh

Bourneと互換性がない唯一のものは(*:"$_dir":*)andであり、これをand(*)に変更する必要があります(Bourneシェルの以前のバージョンでは元のcshのみがサポートされました(80年代半ばまで))。*:"$_dir":*)*)# comments

関連情報