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문법적이어야 합니다. POSIX sh구문은 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

관련 정보