파일의 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/3768 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 \
...
구문은 zsh
bash 호환(분명히 더 쉬운 방법이 있음에도 불구하고 zsh
) 및 bash
-bash 호환(대부분의 POSIX 코드는 표준과의 편차가 훨씬 적기 sh
때문에 bash 호환 가능 )하므로 코드는 둘 중 하나로 읽을 수 있습니다. shell 모든 POSIX 호환 쉘도 마찬가지입니다.bash
zsh
Bourne과 호환되지 않는 유일한 것은 (*:"$_dir":*)
and 이며, 이를 and (*)
로 변경해야 합니다 (Bourne 셸의 이전 버전의 경우 원래 csh만 지원되었습니다(80년대 중반까지)).*:"$_dir":*)
*)
# comments