Linux 경로 폴더 경로를 지정하는 방법. PATH 환경 변수. Linux에서 사용자 및 시스템 환경 변수 추가

에 명령어를 입력하면 명령줄, 기본적으로 쉘에 주어진 이름의 실행 파일을 실행하도록 지시하는 것입니다. 리눅스에서는 이것들 실행 가능한 프로그램, ls, find, file 및 기타 항목은 시스템의 여러 다른 디렉토리에 있는 경향이 있습니다. 이러한 디렉터리에 저장된 실행 권한이 있는 모든 파일은 어디에서나 실행할 수 있습니다. 실행 가능한 프로그램이 포함된 가장 일반적인 디렉토리는 /bin, /sbin, /usr/sbin, /usr/local/bin 및 /usr/local/sbin입니다.

그러나 쉘은 실행 가능한 프로그램을 찾을 디렉토리를 어떻게 알거나 쉘 전체를 검색합니까? 파일 시스템?

대답은 간단합니다. 명령을 실행하면 쉘은 사용자의 $PATH 변수에 지정된 모든 디렉토리에서 해당 이름을 가진 실행 파일을 검색합니다.

이 문서에서는 시스템 $PATH 변수에 디렉터리를 추가하는 방법을 보여줍니다.

Linux에서 $PATH란 무엇입니까?

$PATH 환경 변수는 실행 파일을 검색할 디렉터리를 쉘에 알려주는 콜론으로 표시된 디렉터리 목록입니다.

$PATH 변수에 어떤 디렉터리가 있는지 확인하려면 printenv 또는 echo 명령을 사용할 수 있습니다.

$PATH 에코

출력은 다음과 같습니다.

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

두 개의 서로 다른 디렉터리에 동일한 이름을 가진 두 개의 실행 파일이 있는 경우 셸은 $PATH에서 첫 번째로 나오는 디렉터리에 있는 파일을 실행합니다.

$PATH에 디렉터리 추가

$PATH 변수에 다른 디렉터리를 추가하려는 상황이 있습니다. 예를 들어, 일부 프로그램은 다른 위치에 설치될 수 있습니다. 또는 개인 항목을 위한 전용 디렉터리를 갖고 싶지만 실행 파일에 대한 절대 경로를 지정하지 않고도 해당 프로그램을 실행할 수 있습니다. 이렇게 하려면 $PATH에 디렉터리를 추가하기만 하면 됩니다.

쉘 스크립트를 저장하는 홈 디렉토리에 bin이라는 디렉토리가 있다고 가정해 보겠습니다. $PATH 변수에 디렉터리를 추가하려면 다음 안내를 따르세요.

내보내기 명령은 수정된 변수를 쉘 프로세스의 하위 환경으로 내보냅니다.

이제 실행 파일의 전체 경로를 지정하지 않고 실행 스크립트의 이름만 입력하여 스크립트를 실행할 수 있습니다.

그러나 이 변경 사항은 일시적이며 현재 셸 세션에만 영향을 미칩니다.

변경 사항을 영구적으로 적용하려면 셸 구성 파일에 $PATH 변수를 정의해야 합니다. 대부분의 Linux 배포판에서는 새 세션을 시작할 때 다음 파일에서 환경 변수를 읽습니다.

  • /etc/environment 및 /etc/profile과 같은 전역 쉘 구성 파일입니다. 새 디렉토리를 모든 사람에게 추가하려면 이 파일을 사용하십시오. 시스템 사용자$PATH.
  • 개별 사용자 셸에 대한 구성 파일입니다. 예를 들어 Bash를 사용하는 경우 ~/.bashrc 파일에 $PATH 변수를 설정할 수 있고, Zsh를 사용하는 경우 파일 이름은 ~/.zshrc입니다.

이 예에서는 ~/.bashrc 파일에 변수를 설정합니다. 파일 열기 텍스트 에디터끝에 다음 줄을 추가하십시오.

나노 ~/.bashrc

내보내기 PATH="$HOME/bin:$PATH"

파일을 저장하고 다음을 사용하여 새 $PATH 값을 현재 셸 세션에 로드합니다.

소스 ~/.bashrc

디렉터리가 성공적으로 추가되었는지 확인하려면 다음을 입력하여 $PATH 값을 인쇄합니다.

$PATH 에코

결론

사용자 또는 전역 $PATH에 새 디렉터리를 추가하는 것은 매우 간단합니다. 이를 통해 실행 파일의 전체 경로를 입력하지 않고도 비표준 위치에 저장된 명령 및 스크립트를 실행할 수 있습니다.

어떤 경우에도 동일한 지침이 적용됩니다. 리눅스 배포판, CentOS, RHEL, Debian 및 Linux Mint를 포함합니다.

궁금한 점이 있으면 언제든지 댓글을 남겨주세요.

그것은 무엇입니까? 명령 프롬프트에 입력하는 대부분의 명령에는 파일 시스템에서 로드되는 외부 프로그램을 사용해야 합니다. 예를 들어 mkdir 및 wc와 같은 명령은 실제로 /bin 폴더에 있습니다.

Bash 쉘이 인식하지 못하는 명령을 입력하면 이를 프로그램으로 실행하려고 시도하고 해당 이름을 가진 프로그램을 찾지 못하면 오류를 반환합니다. 그리고 이는 우리가 살펴본 기본 명령에만 적용되는 것이 아닙니다. 명령줄에서 모든 프로그램을 실행할 수 있기 때문입니다.


하지만 파일이 있다면 어떻게 될까요? 리눅스 시스템어떤 디렉토리에서 어떤 프로그램을 실행할지 알고 있나요? OS는 시스템 환경 변수를 사용하여 알 수 없는 명령을 받을 때 검색할 폴더의 하위 집합을 지정합니다. 이 변수는 PATH라고 하며 다음 echo 명령으로 표시할 수 있습니다($ 기호가 필요함).

$PATH 에코

이 명령의 출력은 콜론으로 구분된 다음 7개의 절대 폴더 경로와 같습니다.

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

알 수 없는 문자를 입력할 때마다 리눅스 명령환경 변수에 지정된 각 폴더를 지정된 순서대로 살펴보고 동일한 이름을 가진 프로그램을 찾습니다. 프로그램이 발견되면 실행됩니다. 그렇지 않으면 오류 메시지가 표시됩니다. 하지만 사랑하는 은반지를 선물로 산다면 틀림이 없을 것입니다. 실버는 모든 여성을 장식합니다!

이 7개의 폴더는 다음을 제공합니다. 쉬운 접근모든 주요 프로그램에 운영 체제, 포함 . 이 7개 폴더 외부의 프로그램은 단순히 명령줄에 이름을 입력하는 것만으로는 시작할 수 없습니다.

예를 들어 인터넷에서 홈 폴더로 일기 유틸리티를 다운로드했습니다. 명령 프롬프트에서 해당 이름을 입력하면 시스템 경로에 포함되지 않은 폴더에 있기 때문에 오류 메시지가 나타납니다. 이 프로그램을 실행하려면 다음 행을 입력하십시오(~ 기호는 홈 폴더를 나타내는 약어입니다).

지정된 경로가 아닌 폴더에 저장한 경우 유틸리티를 실행하려면 절대 경로와 파일 이름을 입력해야 합니다.

물론, Diary는 설치가 필요 없는 간단한 독립 실행형 프로그램이라고 가정합니다. 왜냐하면 대부분의 주요 응용 프로그램은 설치 프로세스 중에 프로그램의 실행 파일을 지정된 경로 어딘가에 배치하기 때문입니다. 이와 같이 PATH 환경 변수, 건강을 위해 즐겨보세요!

내보내기 경로=~/opt/bin:$PATH

내보내기 PATH=$PATH:~/opt/bin

9 솔루션은 "PATH에 경로를 올바르게 추가하는 방법"에 대한 양식 웹을 수집합니다.

간단한 일

경로=$PATH:~/opt/bin 경로=~/opt/bin:$PATH

~/opt/bin을 끝에 추가할지(여러 디렉터리에 동일한 이름을 가진 프로그램이 있는 경우 다른 모든 디렉터리를 검색하기 위해) 또는 시작 부분에 추가할지(다른 모든 디렉터리보다 먼저 검색하기 위해)에 따라 다릅니다.

동시에 여러 항목을 추가할 수 있습니다. PATH=$PATH:~/opt/bin:~/opt/node/bin 또는 순서 변경은 괜찮습니다.

변수가 이미 환경에 있으면 내보낼 필요가 없습니다. 변수 값에 대한 모든 변경 사항이 환경에 반영됩니다. PATH는 거의 항상 환경에 있습니다. 모두 유닉스 시스템매우 일찍 설치하십시오(대개 실제로 첫 번째 프로세스에서).

PATH가 다른 구성 요소로 구축된 경우 중복된 항목이 생길 수 있습니다. Unix에서 감지할 소스 디렉터리에 경로를 추가하는 방법을 참조하세요. 명령은 무엇입니까? 중복 항목을 추가하거나 제거하지 않으려면 awk 명령을 사용하여 중복 $PATH 항목을 제거하세요.

어디에 놓을 것인가

~/.bash_rc는 어떤 프로그램에서도 읽을 수 없으며 ~/.bashrc는 대화형 bash 인스턴스용 구성 파일입니다. ~/.bashrc 에 환경 변수를 정의하면 안 됩니다. PATH와 같은 환경 변수를 정의하는 올바른 위치는 ~/.profile(또는 bash가 아닌 쉘이 필요하지 않은 경우 ~/.bash_profile)입니다. 이들 간의 차이점은 무엇이며 어떤 것을 사용해야 합니까?

Bash가 아닌 쉘에 대한 참고 사항

bash, ksh 및 zsh에서 내보내기는 특수 구문이며 PATH=~/opt/bin:$PATH 및 내보내기 PATH=~/opt/bin:$PATH 모두 모든 작업을 올바르게 수행합니다. dash(많은 시스템에서 /bin/sh)와 같은 다른 Bourne/POSIX 셸에서는 내보내기가 일반 명령처럼 구문 분석되는데, 이는 두 가지 차이점을 의미합니다.

  • ~는 할당을 제외하고 단어의 시작 부분에서만 구문 분석됩니다("Unix에서 감지할 소스 디렉터리에 경로를 추가하는 방법, 어떤 명령?" 섹션 참조).
  • PATH에 공백이나 \[*? ,

따라서 대시와 같은 셸에서 내보내기 PATH=~/opt/bin:$PATH는 PATH를 리터럴 문자열 ~/opt/bin/:로 설정하고 그 뒤에 PATH 값이 첫 번째 위치까지 옵니다. PATH=~/opt/bin:$PATH(퍼지 할당)에는 따옴표가 필요하지 않으며 올바른 작업을 수행합니다. 이식 가능한 스크립트에서 내보내기를 사용하려면 내보내기 PATH="$HOME/opt/bin:$PATH" 를 작성해야 합니다.

¹ 이것은 Bourne 로켓에서는 사실이 아니지만(현대 POSIX 스타일 쉘이 아닌 실제 Bourne 쉘에서와 같이) 요즘에는 그렇게 오래된 쉘을 접할 가능성이 거의 없습니다.

어쨌든 작동하지만 동일한 작업을 수행하지는 않습니다. PATH 요소는 왼쪽에서 오른쪽으로 확인됩니다. 첫 번째 예에서는 실행 파일~/opt/bin 은 예를 들어 /usr/bin 에 설치된 것보다 우선합니다. 이는 원하는 것일 수도 있고 아닐 수도 있습니다.

특히 보안 관점에서 볼 때, 경로를 앞쪽에 추가하는 것은 위험합니다. 왜냐하면 누군가가 ~/opt/bin 에 대한 쓰기 액세스 권한을 얻을 수 있다면 예를 들어 / 대신 사용할 다른 ls를 배치할 수 있기 때문입니다. 눈치채지 못한 채 bin/ls 이제 ssh나 브라우저 또는 선택과 동일하다고 상상해 보십시오. (같은 작업이 경로에서 세 번 수행될 수 있습니다.)

질문 2가 혼란스럽습니다(관련 없는 문제와 관련되어 질문에서 제거되었기 때문에).

무엇 효과적인 방법다른 줄에 추가 경로를 추가합니까? 처음에 나는 이것이 트릭을 수행할 수 있다고 생각했습니다.

내보내기 PATH=$PATH:~/opt/bin 내보내기 PATH=$PATH:~/opt/node/bin

하지만 두 번째 할당이 ~/opt/node/bin 뿐만 아니라 이전에 할당된 PATH 를 모두 추가하기 때문에 그렇지 않습니다.

가능한 해결책은 다음과 같습니다.

내보내기 PATH=$PATH:~/opt/bin:~/opt/node/bin

하지만 가독성을 위해 경로당 하나의 대상을 갖는 것이 좋습니다.

당신이 말하는 경우

경로=~/opt/bin

이것 모두,당신의 PATH에 무엇이 있을 것인가. PATH는 단지 환경 ​​변수일 뿐이며, PATH에 추가하려면 정확히 원하는 내용으로 변수를 다시 작성해야 합니다. 따라서 질문 2에서 예시로 제시한 내용은 질문의 요점을 완전히 놓치고 있지 않는 한 정확히 귀하가 원하는 것입니다.

내 코드에서는 두 가지 형식을 모두 사용합니다. 잠재적으로 누락된 디렉터리를 수용하기 위해 작업하는 모든 컴퓨터에 다음과 같은 일반 프로필을 설치합니다.

내보내기 PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # 바인더 경로에 선택적 항목을 추가합니다. $HOME/local/bin $HOME/bin; if [ -d $bindir ]; 그런 다음 PATH=$PATH:$(bindir) fi 완료

Linux는 $PATH 환경에서 실행 가능한 검색 경로를 결정합니다. $PATH 환경의 맨 위에 /data/myscripts 디렉토리를 추가하려면 다음을 사용하십시오.

경로=/데이터/myscripts:$PATH

이 디렉터리를 경로 끝에 추가하려면 다음 명령을 사용합니다.

경로=$PATH:/데이터/myscripts

그러나 이전 것만으로는 충분하지 않습니다. 왜냐하면 스크립트 내부에 환경 변수를 설정하면 해당 변경 사항은 스크립트 내부에서만 적용되기 때문입니다. 이 제한은 다음 두 가지 방식으로만 제한됩니다.

  • 스크립트에서 환경 변수를 내보내면 스크립트에서 호출하는 모든 프로그램에 적용됩니다. 이는 스크립트라는 프로그램에서는 효과적이지 않습니다.
  • 스크립트를 호출하는 프로그램이 호출 대신 포함을 통해 스크립트를 호출하는 경우 스크립트에 대한 환경 변경 사항은 호출 프로그램에 적용됩니다. 이 포함은 dot 명령이나 source 명령을 사용하여 수행할 수 있습니다.

$HOME/myscript.sh 소스 $HOME/myscript.sh

포함은 기본적으로 "호출" 스크립트에 "호출 가능" 스크립트를 포함합니다. 이는 C의 #include와 유사합니다. 따라서 스크립트나 호출 프로그램 내에서 효과적입니다. 그러나 물론 이것은 호출 프로그램이 호출하는 프로그램이나 스크립트에는 효과적이지 않습니다. 호출 체인까지 적용하려면 내보내기 명령을 사용하여 환경 변수 설정을 따라야 합니다.

예를 들어, bash 쉘 프로그램은 .bash_profile 파일의 내용을 포함합니다. 따라서 .bash_profile에 다음 두 줄을 추가합니다.

PATH=$PATH:/data/myscripts 내보내기 PATH

효과적으로 두 줄의 코드를 bash 프로그램에 넣습니다. 따라서 배쉬 변수$PATH에는 $HOME/myscript.sh 가 포함되어 있으며 내보내기 문으로 인해 bash가 호출하는 모든 프로그램에는 $PATH가 수정됩니다. 그리고 bash 프롬프트에서 시작된 모든 프로그램은 bash에 의해 호출되므로 bash 프롬프트에서 시작하는 모든 프로그램에 대해 새 경로가 유효합니다.

결론은 경로에 새 디렉터리를 추가하려면 셸에 포함된 스크립트의 $PATH 환경 변수에 디렉터리를 추가하거나 $PATH 환경 변수를 내보내야 한다는 것입니다.

추가 정보여기

한동안 나는 중복에 대해 걱정할 필요 없이 경로에 요소를 추가하는 데 도움이 되는 두 가지 함수 pathadd 및 pathrm을 유지했습니다.

pathadd는 하나의 경로 인수와 선택적 after 인수를 취하며, 추가되면 PATH에 추가되고 그렇지 않으면 추가됩니다.

거의 모든 상황에서 경로를 추가하면 이미 경로에 있는 내용을 무시하고 싶을 것이므로 기본적으로 추가하는 것을 선호합니다.

Pathadd() ( newelement=$(1%/) if [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; then if [ " $2" = "이후" ] ; then PATH="$PATH:$newelement" else PATH="$newelement:$PATH" fi fi ) pathrm() ( PATH="$(echo $PATH | sed -e "s; \(^\|:\)$(1%/)\(:\|\$\);\1\2;g" -e "s;^:\|:$;;g" -e "s ;::;:;g")" )

PATH 환경을 변경하려는 스크립트에 배치하면 이제 그렇게 할 수 있습니다.

Pathadd "/foo/bar" pathadd "/baz/bat" PATH 내보내기 후

경로가 이미 존재하는 경우 경로에 추가하지 않는 것이 보장됩니다. 이제 /baz/bat를 시작 부분에 두기를 원하는 경우.

Pathrm "/baz/bat" pathadd "/baz/bat" 내보내기 PATH

이제 경로가 두 배로 늘어나지 않고 이미 경로에 있는 경우 모든 경로를 앞으로 가져올 수 있습니다.

다른 배포판에 대해서는 말할 수 없지만 Ubuntu에는 모든 사용자의 표준 검색 경로인 /etc/environment 파일이 있습니다. 내 컴퓨터는 나만 사용하므로 스크립트에 임시로 추가하는 디렉터리라면 무엇이든 내 경로에 넣습니다.

내 해결책은 다음과 같습니다.

PATH=$(echo -n $PATH | awk -v RS=: -v ORS=: "!x[$0]++" | sed "s/\(.*\).\(1\)/\1 /")

후행을 남기지 않는 멋진 가벼운 라이너:

나에게는(Mac OS X 10.9.5에서) /etc/paths 파일에 경로 이름(예: /mypathname)을 추가하는 것이 매우 잘 작동했습니다.

편집하기 전에 echo $PATH가 반환됩니다.

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

/etc/paths를 편집하고 셸을 다시 시작하면 $PATH 변수가 /pathname 과 함께 추가됩니다. 실제로 echo $PATH는 다음을 반환합니다.

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/mypathname

/mypathname이 $PATH에 추가되었습니다.

PATH 환경 PATH에 새 경로를 추가하려면:

내보내기 PATH=$PATH:/new-path/

이 변경 사항을 열려는 모든 셸에 적용하려면 셸을 호출할 때 호출할 파일에 추가하세요. 다른 쉘에서는 다음과 같을 수 있습니다.

  • 배시 셸: ~/.bash_profile, ~/.bashrc 또는 profile
  • Korn 셸: ~/.kshrc 또는 .profile
  • Z 셸: ~/.zshrc 또는 .zprofile

예를 들어

# 내보내기 PATH=$PATH:/root/learning/bin/ # 소스 ~/.bashrc # echo $PATH

위 출력에서 ​​제공된 경로를 볼 수 있습니다.

Linux의 모든 파일에는 파일 관리자나 콘솔 유틸리티를 사용하여 액세스할 수 있는 파일 시스템의 특정 주소가 있습니다. 이것은 매우 간단한 주제이지만 많은 초보자들이 어려움을 겪고 있습니다.

오늘의 짧은 기사에서는 Linux 파일의 경로가 무엇인지, 경로가 무엇인지, 올바르게 작성하는 방법 등을 살펴보겠습니다. 이전에 이 문제에 어려움이 있었다면 기사를 읽은 후에 모든 것이 완전히 명확해질 것입니다.

Linux의 파일 경로

Linux 파일 시스템은 Windows와 매우 다릅니다. 우리는 그 구조를 고려하지 않을 것입니다. 그것은 이전에 수행되었습니다. 우리는 파일 작업에 중점을 둘 것입니다.

가장 중요한 차이점은 파일 주소가 드라이브(예: Windows에서 발생하는 C:\ 또는 D:\)가 아니라 다른 모든 항목이 연결된 루트 시스템 디렉터리인 루트에서 시작된다는 것입니다. 그의 주소 - /. 그리고 여기서는 주소에 대해 이야기해야 합니다. Linux 파일 경로는 슬래시 "/"를 사용하여 주소에서 디렉터리를 구분하는데, 이는 Windows에서 보던 것과는 다릅니다(\).

예를 들어, Windows가 가득 찼습니다.데스크탑의 파일 경로는 C:\Users\Sergiy\Desktop\과 같으며, Linux의 파일 경로는 간단히 /home/sergiy/desktop/입니다. 이것으로 지금까지 모든 것이 간단하고 명확합니다. 그러나 문제는 더 발생합니다.

Linux 운영 체제에는 여러 유형의 파일 경로가 있을 수 있습니다. Linux에 어떤 경로가 있는지 살펴보겠습니다.

  • 파일 시스템 루트의 전체 절대 Linux 경로- 위의 예에서 이 경로를 이미 본 적이 있습니다. 루트 "/"에서 시작하여 파일의 전체 경로를 설명합니다.
  • 리눅스 상대 경로- 현재 폴더를 기준으로 한 파일의 상대 경로입니다. 이러한 경로는 종종 혼란을 야기합니다.
  • 현재 사용자의 홈 폴더에 대한 상대 경로입니다.- 파일 시스템의 경로(루트가 아닌 현재 사용자 폴더)

이제 Linux에서 이러한 경로가 어떻게 보이는지 자세히 살펴보고 완전히 명확하게 설명하기 위해 몇 가지 예를 살펴보겠습니다. 데모에서는 디렉토리의 내용을 볼 수 있도록 설계된 ls 유틸리티를 사용합니다.

예를 들어 홈 폴더에 다음과 같은 디렉터리가 있고 그 안에 네 개의 파일이 있습니다.

파일 중 하나에 대한 전체 Linux 경로는 다음과 같습니다.

ls /홈/sergiy/tmp/file1

이는 이미 홈 폴더에서 시작하는 상대 Linux 경로이며 ~/로 지정되어 있습니다. 참고로 ~가 아니라 ~/입니다. 그런 다음 하위 폴더(이 경우 tmp)를 지정할 수 있습니다.

또는 현재 폴더를 기준으로 한 Linux의 파일 경로는 다음과 같습니다.

첫 번째 링크는 현재 폴더(.)를 가리키고, 두 번째 링크(..)는 상위 폴더를 가리킵니다. 이는 카탈로그 탐색에 더 큰 가능성을 열어줍니다. 예를 들어, 현재 폴더의 파일을 참조하려면 다음 구문을 사용할 수 있습니다.

파일의 내용을 볼 때는 아무 소용이 없습니다. 하지만 프로그램을 실행할 때 매우 중요합니다. 프로그램은 먼저 PATH 환경에서 검색된 다음 이 폴더에서만 검색되기 때문입니다. 따라서 현재 폴더에 있는 프로그램을 실행해야 하고 /bin 디렉토리에 있는 프로그램과 정확히 동일하게 호출되는 경우 현재 폴더에서 파일을 찾아야 하는 명시적인 링크가 없으면 아무것도 작동하지 않습니다.

이러한 구성은 프로그램을 컴파일할 때 자주 발생할 수 있습니다. 이러한 모든 기호와 Linux 파일 경로는 터미널뿐만 아니라 모든 곳에서 사용할 수 있습니다. 파일 관리자, 이는 매우 편리할 수 있습니다.

하지만 리눅스 터미널더 큰 기회를 제공합니다. 파일이나 디렉터리 주소에 직접 간단한 와일드카드 문자를 사용할 수 있습니다. 예를 들어 f로 시작하는 모든 파일을 나열할 수 있습니다.

또는 tmp 폴더뿐만 아니라 홈 폴더의 모든 하위 폴더에서도 검색할 수 있습니다.

그리고 이 모든 것이 효과가 있을 것입니다. 아마도 항상 필요하고 실용적인 것은 아닐 수도 있습니다. 그러나 특정 상황에서는 많은 도움이 될 수 있습니다. 이러한 기능은 Bash 셸 수준에서 구현되므로 모든 명령에서 사용할 수 있습니다. 쉘은 발견된 파일 수를 확인하고 각 파일에 대해 명령을 호출합니다.

결론

그게 다야. 이제 경로를 올바르게 작성하는 것뿐만 아니라 필요한 모든 것을 알게 되었습니다. 리눅스 파일을 사용할 수도 있지만 cd 명령을 사용하여 파일을 검색하거나 디렉터리를 탐색하는 등 더 복잡한 작업도 수행할 수 있습니다. 궁금한 점이 있다면 댓글로 질문해주세요!

관련 게시물:


PATH 환경 변수에 새 경로를 어디에 추가해야 하는지 궁금합니다. 예를 들어 .bashrc를 편집하여 이 작업을 수행할 수 있다는 것을 알고 있지만 이를 수행하는 방법은 명확하지 않습니다.

따라서:

내보내기 경로=~/opt/bin:$PATH

내보내기 PATH=$PATH:~/opt/bin

답변 11개

단순한 소재

경로=$PATH:~/opt/bin 경로=~/opt/bin:$PATH

~/opt/bin 코드를 끝에 추가할지(여러 디렉터리에 동일한 이름을 가진 프로그램이 있는 경우 다른 모든 디렉터리를 검색하기 위해) 또는 시작 부분에 추가할지(다른 모든 디렉터리보다 먼저 검색하기 위해)에 따라 다릅니다.

동시에 여러 항목을 추가할 수 있습니다. PATH=$PATH:~/opt/bin:~/opt/node/bin 또는 순서 변경은 괜찮습니다.

변수가 이미 환경에 있는 경우 내보낼 필요가 없습니다. 변수 값에 대한 모든 변경 사항이 환경에 반영됩니다.¹ PATH는 거의 항상 환경에 있습니다. 모든 유닉스 시스템은 이를 매우 초기에 설치합니다(사실 일반적으로 첫 번째 프로세스에서).

PATH가 다양한 구성 요소에 의해 생성된 경우 중복된 항목이 생길 수 있습니다. Unix에서 감지할 홈 디렉터리에 경로를 추가하는 방법을 참조하세요. 어떤 명령이 필요합니까? 중복을 피하거나 제거하려면 awk 명령을 사용하여 중복된 $PATH 항목을 제거하세요.

어디에 놓을 것인가

~/.bash_rc는 어떤 프로그램에서도 읽을 수 없으며 ~/.bashrc는 대화형 bash 인스턴스용 구성 파일입니다. ~/.bashrc 에 환경 변수를 정의하면 안 됩니다. PATH와 같은 환경 변수를 정의하는 올바른 위치는 ~/.profile(또는 bash 이외의 쉘을 좋아하지 않는 경우 ~/.bash_profile)입니다. 차이점은 무엇이며 어떤 것을 사용해야 합니까?를 참조하세요.

Bash가 아닌 쉘에 대한 참고 사항

bash, ksh 및 zsh에서 내보내기는 특수 구문이며 PATH=~/opt/bin:$PATH 및 내보내기 PATH=~/opt/bin:$PATH 모두 올바른 작업을 수행합니다. dash(많은 시스템에서 /bin/sh)와 같은 다른 Bourne/POSIX 셸에서는 내보내기가 일반 명령처럼 구문 분석되는데, 이는 두 가지 차이점을 의미합니다.

  • ~는 할당을 제외하고 단어의 시작 부분에서만 구문 분석됩니다(명령이 필요한 Unix에서 감지할 홈 디렉터리 경로를 어떻게 추가합니까? 참조).
  • $PATH 외부 큰따옴표 PATH에 공백이나 \[*? .

따라서 대시와 같은 셸에서 내보내기 PATH=~/opt/bin:$PATH는 PATH를 리터럴 문자열 ~/opt/bin/:으로 설정하고 그 뒤에 PATH 값이 첫 번째 위치까지 옵니다. PATH=~/opt/bin:$PATH(간단한 할당)에는 따옴표가 필요하지 않으며 모든 작업이 올바르게 수행됩니다. 이식 가능한 스크립트에서 내보내기를 사용하려면 내보내기 PATH="$HOME/opt/bin:$PATH" 또는 PATH=~/opt/bin:$PATH 내보내기 PATH(또는 PATH=$HOME/opt)를 작성해야 합니다. /bin: $PATH 내보내기 var=value를 허용하지 않고 물결표 확장을 수행하지 않은 Bourne 쉘로의 이식성을 위한 내보내기 PATH입니다.

¹ 이것은 Bourne 쉘에서는 사실이 아니지만(최신 POSIX 스타일 쉘이 아닌 실제 Bourne 쉘에서와 같이) 요즘에는 오래된 쉘을 접할 가능성이 거의 없습니다. 하위>

어느 쪽이든 작동하지만 동일한 작업을 수행하지는 않습니다. PATH 요소는 왼쪽에서 오른쪽으로 확인됩니다. 첫 번째 예에서 ~/opt/bin의 실행 파일은 예를 들어 /usr/bin에 설치된 실행 파일보다 우선합니다. 이는 원하는 것일 수도 있고 아닐 수도 있습니다.

특히 보안 관점에서 앞쪽에 경로를 추가하는 것은 위험합니다. 누군가가 ~/opt/bin 에 대한 쓰기 액세스 권한을 얻을 수 있다면 예를 들어 /bin/ls 대신 사용할 또 다른 ls를 넣을 수 있기 때문입니다. 눈치채지 못한 채. 이제 SSH나 브라우저 또는 선택에 대해 동일한 것을 상상해 보십시오... (동일한 작업이 경로에 세 번 적용됩니다.)

질문 2에 대해 혼란스러워요. 관련 문제):

다른 줄에 추가 경로를 추가하는 효율적인 방법은 무엇입니까? 처음에 나는 이것이 트릭을 수행할 수 있다고 생각했습니다.

내보내기 PATH=$PATH:~/opt/bin 내보내기 PATH=$PATH:~/opt/node/bin

하지만 이는 두 번째 할당이 ~/opt/node/bin 뿐만 아니라 이전에 할당된 PATH 를 추가하기 때문이 아닙니다.

가능한 해결 방법은 다음과 같습니다.

내보내기 PATH=$PATH:~/opt/bin:~/opt/node/bin

그러나 가독성을 위해 경로당 하나의 대상을 갖는 것이 좋습니다.

당신이 말하는 경우

경로=~/opt/bin

이것 모두, 이는 PATH에 있습니다. PATH는 단지 환경 ​​변수일 뿐이며, PATH에 추가하려면 정확히 원하는 내용으로 변수를 다시 작성해야 합니다. 즉, 질문 2에서 예시로 제시하신 내용은 제가 질문의 요점을 완전히 놓친 경우를 제외하고는 정확히 귀하가 원하는 작업입니다.

내 코드에서는 두 가지 형식을 모두 사용합니다. 잠재적으로 누락된 디렉터리를 호스팅하기 위해 작업하는 모든 컴퓨터에 다음과 같은 일반 프로필을 설치합니다.

내보내기 PATH=/opt/bin:/usr/local/bin:/usr/contrib/bin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11 # 바인더 경로에 선택적 항목을 추가합니다. $HOME/local/bin $HOME/bin; if [ -d $bindir ]; 그런 다음 PATH=$PATH:$(bindir) fi 완료

Linux는 $PATH 환경 변수를 사용하여 실행 가능한 검색 경로를 정의합니다. $PATH 환경 변수의 시작 부분에 /data/myscripts 디렉터리를 추가하려면 다음을 사용합니다.

경로=/데이터/myscripts:$PATH

이 디렉터리를 경로 끝에 추가하려면 다음 명령을 사용합니다.

경로=$PATH:/데이터/myscripts

그러나 이전 것만으로는 충분하지 않습니다. 왜냐하면 스크립트 내부에 환경 변수를 설정하면 해당 변경 사항은 스크립트 내부에서만 적용되기 때문입니다. 이 제한은 다음 두 가지 방식으로 제한됩니다.

  • 스크립트 내에서 환경 변수를 내보내면 스크립트에서 호출하는 모든 프로그램 내에서 효과적입니다. 이는 스크립트를 호출한 프로그램에서는 효과적이지 않습니다.
  • 스크립트를 호출하는 프로그램이 호출 대신 포함을 통해 스크립트를 호출하는 경우 스크립트에 대한 환경 변경 사항은 호출 프로그램에 적용됩니다. 이 포함은 dot 명령이나 source 명령을 사용하여 수행할 수 있습니다.

$HOME/myscript.sh 소스 $HOME/myscript.sh

포함은 기본적으로 "호출" 스크립트에 "호출 가능" 스크립트를 포함합니다. 이는 C의 #include와 유사합니다. 따라서 스크립트나 호출 프로그램 내에서 효과적입니다. 그러나 물론 이것은 호출 프로그램이 호출하는 프로그램이나 스크립트에는 효과적이지 않습니다. 호출 체인까지 적용하려면 내보내기 명령을 사용하여 환경 변수 설정을 따라야 합니다.

예를 들어, bash 쉘 프로그램은 .bash_profile 파일의 내용을 포함합니다. 따라서 .bash_profile에 다음 두 줄을 입력하세요.

PATH=$PATH:/data/myscripts 내보내기 PATH

효과적으로 두 줄의 코드를 bash 프로그램에 넣습니다. 따라서 bash에서 $PATH 변수에는 $HOME/myscript.sh가 포함되며, 내보내기 문으로 인해 bash에서 호출되는 모든 프로그램에는 $PATH 변수가 수정됩니다. 그리고 bash 프롬프트에서 실행하는 모든 프로그램은 bash에 의해 호출되므로 bash 프롬프트에서 실행하는 모든 프로그램에 새 경로가 적용됩니다.

결론은 경로에 새 디렉터리를 추가하려면 셸에 포함된 스크립트의 $PATH 환경 변수에 디렉터리를 추가하거나 $PATH 환경 변수를 내보내야 한다는 것입니다.

나는 중복에 대한 걱정 없이 경로에 요소를 추가하는 데 도움이 되는 두 가지 함수 pathadd 및 pathrm을 한동안 유지했습니다.

pathadd는 하나의 경로 인수와 선택적인 after 인수를 취하며, 추가되면 PATH에 추가되고, 그렇지 않으면 추가됩니다.

어떤 상황에서든 경로를 추가하는 경우 이미 경로에 있는 모든 항목을 재정의하고 싶을 것이므로 기본적으로 추가하는 것을 선호합니다.

Pathadd() ( newelement=$(1%/) if [ -d "$1" ] && ! echo $PATH | grep -E -q "(^|:)$newelement($|:)" ; then if [ " $2" = "이후" ] ; then PATH="$PATH:$newelement" else PATH="$newelement:$PATH" fi fi ) pathrm() ( PATH="$(echo $PATH | sed -e "s; \(^\|:\)$(1%/)\(:\|\$\);\1\2;g" -e "s;^:\|:$;;g" -e "s ;::;:;g")" )

PATH 환경을 변경하려는 스크립트에 배치하면 이제 완료됩니다.

Pathadd "/foo/bar" pathadd "/baz/bat" PATH 내보내기 후

경로가 이미 존재하는 경우 경로를 추가하지 않는 것이 보장됩니다. /baz/bat를 먼저 실행하려는 경우.

Pathrm "/baz/bat" pathadd "/baz/bat" 내보내기 PATH

이제 모든 경로가 이중화 없이 이미 경로에 있는 경우 앞으로 이동할 수 있습니다.

방탄 첨가/사전 제조 방법

추가 및 추가를 선택하는 데에는 많은 고려 사항이 있습니다. 그 중 다수는 다른 답변에서 다루어지므로 여기서는 반복하지 않겠습니다.

중요한 점은 시스템 스크립트가 이것을 사용하지 않더라도(이유가 궁금합니다) *1, PATH 환경 변수에 경로(예: $HOME/bin)를 추가하는 방탄 방법이라는 것입니다.

PATH="$(PATH:+$(PATH):)$HOME/bin"

(PATH="$PATH:$HOME/bin" 대신) 추가하고

PATH="$HOME/bin$(PATH:+:$(PATH))"

추가하려면(PATH="$HOME/bin:$PATH" 대신)

이렇게 하면 $PATH가 처음에 비어 있을 때 잘못된 선행/후행 콜론을 방지할 수 있습니다. 이는 원치 않는 부작용이 있을 수 있고 찾기가 악몽일 수 있습니다(이 답변은 awk -way 사례를 간략하게 설명합니다).

$(매개변수:+단어)

매개변수가 null이거나 설정되지 않은 경우 아무것도 대체되지 않으며, 그렇지 않으면 대체됩니다. 단어 단어.

따라서 $(PATH:+$(PATH):)는 다음으로 확장됩니다. 1) PATH가 null이거나 설정되지 않은 경우 아무것도 없음, 2) $(PATH): PATH가 설정된 경우.

메모. 이것은 배쉬를 위한 것입니다.

*1 방금 devtoolset-6/enable과 같은 스크립트가 이것을 사용한다는 것을 알았습니다. $ cat /opt/rh/devtoolset-6/enable # 일반 환경 변수 내보내기 PATH=/opt/rh/devtoolset-6/root/usr /bin $(PATH:+:$(PATH)) ...

다른 배포판에 대해서는 말할 수 없지만 Ubuntu에는 모든 사용자의 기본 검색 경로인 /etc/environment 파일이 있습니다. 내 컴퓨터는 나만 사용하기 때문에 스크립트에 임시로 추가하는 것이 아닌 한 내 경로에 원하는 디렉터리를 모두 넣습니다.

나에게는(Mac OS X 10.9.5에서) /etc/paths 파일에 경로 이름(예: /mypathname)을 추가하는 것이 매우 잘 작동했습니다.

편집하기 전에 echo $PATH가 반환됩니다.

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

/etc/paths를 편집하고 셸을 다시 시작하면 $PATH 변수가 /pathname 과 함께 추가됩니다. 실제로 echo $PATH는 다음을 반환합니다.

/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/mypathname

$PATH 변수에 /mypathname이 추가되었습니다.