[Pipex] 환경변수(environment variable), $PATH

Yejin Kim·2022년 6월 19일
0

42 cursus

목록 보기
12/20

환경변수란?

프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는 동적인 값들의 모임

사전적으로는 위와 같이 나타낼 수 있는데,
간단하게 이해하자면 해당 환경에서 프로그램을 돌릴 때 사용할 수 있는 변수라고 할 수 있다.


env 명령어를 통해 현재 환경 변수를 확인할 수 있다.

위와 같은 test.sh 이라는 쉘 스크립트가 있을 때 이 프로그램은 PATH라는 변수를 필요로 한다. 이 PATH 변수는 해당 환경 내에서 정의되어 있는 환경변수이기 때문에 적절히 변환되어 사용이 가능한 것이다.


환경변수 PATH

환경변수들 중에서도 PATH는 pipex와 minishell 과제에서 유의깊게 살펴보아야 한다.

PATH는 어떤 프로그램을 실행시킬 때 실행 파일을 찾을 경로를 저장해놓는 변수이다. PATH에는 여러 경로가 저장되어 있고, 그 경로들은 각각 : 로 구분되어 있다.
따라서 현재 내 환경 변수에 저장되어 있는 경로들은 다음과 같다.

  • /Users/yejin/opt/anaconda3/condabin
  • /opt/homebrew/bin
  • /usr/local/bin
  • /usr/bin
  • /bin
  • /usr/sbin
  • /sbin
  • /usr/local/m1-homebrew/bin

Command의 경로 찾기

어떤 프로그램(command)를 실행시킬 때 bash는 다음과 같은 방식으로 command 실행 파일의 경로를 찾는다.

  1. 기본적으로 해당 프로그램명(command)이 '/'를 포함하고 있으면 경로가 명시되어 있는 것으로 판단한다.
    • 이 경우 경로가 이미 있으므로 별도의 경로 탐색없이 해당 프로그램명으로 바로 프로그램을 실행시키는 동작을 한다.
  2. '/'가 없으면 경로가 명시되지 않았다고 판단하여 환경변수 $PATH 에서 실행가능한 경로를 찾는다.
    • PATH에 있는 모든 경로에서 실행 가능 여부를 앞에서부터 하나씩 check
    • 가장 먼저 실행가능하다고 판단된 경로로 프로그램을 실행시키게 된다.
    • 어떤 경로에서도 실행이 불가능하면 Error로 판단

예시 )

  • 입력으로 test.sh이 들어오면 '/'가 없기 때문에 경로가 명시되어 있지 않은 것으로 판단
    • 실제로는 현재 directory에 test.sh이 있기 때문에 test.sh 자체가 경로가 되지만 '/' 여부로 판단하기 때문에 경로가 명시되어 있지 않은 것으로 인식하게 된다.
  • $PATH에서 경로를 찾는다.
  • 모든 경로에서 test.sh이 실행되지 않는다. (해당 파일이 모든 경로에 없으므로 실행될 수 없음)
  • Error로 판단

  • 입력으로 ./test.sh이 들어오면 '/'가 있기 때문에 경로가 명시된 것으로 판단
    • . 는 현재 디렉토리를 의미하기 때문에 실질적으로 test.sh과 ./test.sh은 같은 파일을 가리킨다.
  • 경로가 이미 명시되어 있으므로 별도의 탐색 없이 ./test.sh 로 실행
  • 해당 경로에 파일이 존재하므로 원하는 프로그램이 실행됨

pipex와 minishell에서 command에 /bin/ls와 같이 절대 경로가 들어올 수도 있지만 ls와 같이 경로가 없이 들어오는 케이스도 처리가 가능해야 하므로 PATH 정보를 적절히 parsing하여 저장하고 경로가 없는 command에 대해서는 실행 가능한 경로를 찾아, 경로를 붙여 execve 함수에 넘겨주어야 한다.

어떤 command에 대한 절대 경로는 which라는 명령어를 통해 확인 가능하다


환경변수 사용하기

프로그램 내에서 환경 변수는 다양한 방법으로 가져올 수 있는데 과제에서 사용 가능한 방법은 크게 두 가지가 있다.

  • extern char **environ
    c 프로그램에서는 environ 이라는 환경 변수에 대한 전역변수가 이미 만들어져 있다. 이를 함수 내부에 작성해주면 사용이 가능하다.
    다만 42에서는 전역변수에 대한 제한이 철저한 만큼 논란이 많으므로 주의가 필요하다.

  • int main(int argc, char *argv[], char *envp[])
    main 함수에서 인자로 환경변수를 받는 방법도 있다.

전역변수가 아니므로 논란은 거의 없지만 계속 argument로 자료를 가지고 다녀야 한다는 단점이 있다.


🦋 pipex repo address

https://github.com/kyj93790/42-cursus/tree/master/pipex


참고 사이트
https://ehpub.co.kr/tag/environ-변수/

profile
The World Is My Oyster 🌏

0개의 댓글