기타

linux - 명령어 실행 시 조회 순서, 명령어에 경로가 포함된 경우 실행 차

whyHbr 2025. 2. 23. 17:48
728x90
반응형

명령어 실행 시 조회 순서.

  • 내장 명령어 Built-in command
    • 셸 자체에 내장된 명령어 cd, echo, exit 등.
    • 조회 순서: 쉘은 명령어가 내장 명령어 인지 확인. 만약 내장 명령어라면, 쉘이 바로 실행
    echo "hello"
    "hello"
    
  • 함수 Function 인지 확인
    • 내장 명령어가 아니라면, 사용자 정의 셸 함수(function) 인지 확인. function 을 확인하여 셸에서 명령어처럼 사용할 수 있는 사용자 정의 함수가 있는 지 확인
    //함수 greet 정의
    greet() {
    	echo "hello function" 
    	}
    	
    	greet
    	hello function
    

 

  • 별칭 Alias 인지 확인
    • 셸 함수가 아니라면, 별칭인지 확인.
    //별칭 지정 방법
    alias ll='ls -l'
    // 실행 방법
    ll
    
  • 실제 실행 파일인지 확인
    • 내장 명령어, 함수, 별칭이 아니라면 셸은 실제 파일인지 확인.
    • 이 때 명령어는 $PATH 환경변수에 설정된 디렉터리들에서 찾음.
      • $PATH? 시스템이 실행 파일을 찾는 디렉터리 경로들을 저장하는 환경 변수
        • 사용자가 명령어를 입력했을 때 시스템이 해당 명령어의 실행 파일을 찾는 경로를 지정.
        • $PATH 에서 여러 디렉토리 경로가 콜론: 으로 구분되어 저장된다.
        • $PATH 에 등록된 경로에 있는 명령어는 전체 경로를 입력하지 않고 실행 할 수 있다.
        • echo $PATH 명령어로 확인 가능
  • 파일의 실행 권한 확인
    • 명령어가 실행 파일이라면, 파일이 실행권한 = x를 가지고 있는지 확인. 권한이 없다면 셸은 명령어를 실행 할 수 없어 “Permission denied” 라는 오류가 발생한다.
    //permission denied 대처 방법
    //chmod 로 권한부여
    chmod +x test.txt
    
  • 해시 테이블에 캐시된 경로 확인
    • 셸은 해시 테이블을 사용하여 자주 사용되는 명령어들의 경로를 캐시한다. 셸이 자주 실행되는 명령어의 경로를 캐시 해두어, 명령어를 빠르게 찾을 수 있게 해준다.
    // hash 로 현재 셸의 명령어 해시 목록 출력
    hanboreum@DESKTOP-VO9DV1I:~$ hash
    hits    command
      23    /usr/bin/ls
       1    /usr/sbin/ip
       1    /usr/bin/mkdir
       1    /usr/bin/hostname
       1    /usr/bin/touch
    
    
  • 실행할 수 없다면 “command not found” 발생
    • 위의 단계를 거치고도 찾을 수 없다면 command not found 에러 발생.
    • 명령어가 셸에 정의되어 있지 않거나, 실행 파일 없거나, 경로에 존재하지 않거나, 실행 권한이 없는 경우에 발생한다.

명령어에 경로가 포함된 경우 실행 시 차이

리눅스에서 명령어에 경로가 포함된 경우 (/bin/ls or ./scrips.sh) 명령어 실행 과정에서 일반적인 명령어 검색 방식과 차이가 발생한다.

  • 내장 명령어, 함수, 별칭, $PATH 검색 생략
    • 경로가 포함된 명령어는 이미 전체 경로가 명시되어 있으므로, 셸은 내장 명령어 (builtin command), 셸 함수, 별칭, 또는 $PATH 에서 명령어를 찾는 과정을 생략한다.
      • ex) ls 명령어가 실행하려고 할 때 $PATH 에 등록된 디렉터리들에서 ls를 검색하는 대신, ls 명령어가 경로가 /bin/ls 로 명시되어 있으면, 그 경로에서 바로 실행 파일을 찾는다.
    • 이렇게 경로가 포함된 명령어는 경로 지정 자체로 실행 파일을 정확히 찾기에, 셸은 추가적인 검색을 하지 않고 경로를 발 사용해 명령어를 처리한다.
  • 해당 경로에 파일이 존재하는지 확인
    • 명령어가 경로와 함께 제공되면, 시스템은 그 경로에 해당 파일이 존재하는지 확인한다.
    /usr/bin/ls
    
    • ls 명령어는 /ust/bin/ls 디렉토리 안에 있는 ls 실행 파일을 직접 지정한 것이다. 이 때 시스템은 /usr/bin/ls 경로에 해당 파일이 존재하는지 확인한다
      • 파일 無: “No such file or directory”
      • 파일 有: 실행 가능 여부 확인
  • 해당 파일이 실행 가능한지 확인
    • 경로에 지정된 파일 존재 시, 실행 가능한지 (권한 execute x) 확인. 권한이 없다면 실행을 막고, Permission denied 오류 발생 시킨다.
    hanboreum@DESKTOP-VO9DV1I:~/doc$ ./file2.txt
    //권한 미존재
    -bash: ./file2.txt: Permission denied
    //권한 부여
    hanboreum@DESKTOP-VO9DV1I:~/doc$ chmod +x file2.txt
    hanboreum@DESKTOP-VO9DV1I:~/doc$ ./file2.txt
    
    
  • 파일 실행 가능하다면 실행
    • 파일 존재, 권한있다면 실행.
  • 파일이 없다면 No such directory
  • ./file6.txt -bash: ./file6.txt: No such file or directory

sum:

  1. 명령어에 경로가 포함되면: 셸은 해당 경로에서 파일을 찾고 실행. $PATH 나 내장 명령어, 함수, 별칭 등은 검색하지 않는다
  2. 파일 존재 여부 확인: 지정된 경로에 파일이 존재하는지 확인
  3. 실행 권한 확인: x 권한이 있는지 확인
  4. 실행: 파일 존재, 권한 존재한다면 파일 실행
  5. 파일이 없다면 no such directory
728x90

'기타' 카테고리의 다른 글

vim - 텍스트 편집기  (1) 2025.02.23
linux - 명령어  (0) 2025.02.23
linux 리눅스 권한, 명령어  (0) 2025.02.19
Elastic search?  (0) 2025.02.17
Redis 를 어디에 쓸까  (0) 2025.01.10