Exp/Linux

[Linux] 리눅스 경로는 어디서부터 일까?(2)

kilog 2024. 4. 30. 11:15
728x90

안녕하세요 ki입니다.

오늘 Exp는 지난 Exp에 이어 경로에 대한 명령어에 대해 적어보려고 합니다.

2024.04.28 - [Exp/Linux] - [Linux] 리눅스 경로는 어디서부터일까?(1)

 

[Linux] 리눅스 경로는 어디서 부터일까?(1)

안녕하세요 ki입니다.오늘  Exp는 리눅스에서 경로 얻는 방법입니다.기본적으로 pwd라는 명령어로 경로를 얻을 수 있지만 경우에 따라 쉘스크립트를 작성에 정확한 경로를 얻어야 하고서버에 파

kkkkt.tistory.com

 

제가 명령어에 대해 적는 이유는 쉘스크립트 작성 시 절대경로를 찾아 파일을 실행시키고 필요시 경로를 설정하기도 하여 공유를 하려고 합니다.

 

 

 

 

pwd

 

기본적으로 pwd라는 명령어로 경로를 조회할 수 있습니다.  pwd 명령어는 "print working directory"의 약어로, 현재 작업 중인 디렉토리를 출력하는 데 사용됩니다. 저번 글에서 처럼 root가 최상위 폴더이며 "/"로 표시하여 경로 조회 시에도 /로 시작됩니다. pwd 명령어는 별도의 옵션 없이 사용되며, 현재 디렉토리의 전체 경로를 표시합니다.

pwd
# /

# ex) 경로가 root/test1 이라면
pwd

# /test1

 

 

pwd 옵션들

pwd는 보통 별도의 옵션 없이 사용합니다. 옵션을 사용할 경우 다음과 같습니다.

  • -L: 심볼릭 링크를 따라가지 않고 현재 디렉토리의 실제 경로를 출력합니다.
  • -P: 심볼릭 링크를 따라가고, 정규화된 경로를 출력합니다.
# pwd -P 
# pwd [옵션] 이며 대문자로 작성해야 합니다.

# 정규화된 경로를 출력한다는 뜻은 심볼릭링크(바로가기 파일)에 실제 위치를 출력
pwd -P



# pwd -L
# pwd [옵션] 이며 대문자로 작성해야 합니다.

# 심볼릭링크(바로가기 파일)를 따라가지 않고 현재 위치 절대 경로를 출력
pwd -L

 

 

 

 

쉘스크립트로 경로 찾기

이번 주제로 Exp를 적게 된 계기는 여기에 있습니다. 쉘스크립트로 경로를 찾아야 하는 것인데요.

sh파일인 쉘파일을 실행하였을 때 경로를 찾아야 하는 것이 개발 로직에 포함됐었습니다.

 

저는 쉘에서 sh명령어로 직접 스크립트를 실행하는 경우와 source명령어로 환경변수만 읽어오는 경우 중에

실행하는 경우에 해당하여 아래와 같은 방법으로 sh파일을 작성했습니다.

 

#t1.sh에 작성한 스크립트

#!/bin/sh
SHELL_PATH=`pwd -P`
echo $SHELL_PATH

# 실행
sh t1.sh

# 결과
# PARAM: t1.sh
# Dir: .
# /root/test1

 

작성 시에  SHELL_PATH=`pwd -P` 부분에 ``(따옴표) 표로 묶어줘야 명령어로 인식합니다. (싱글 쿼터가 아닙니다..!)

이 방법은 sh에 위치에 따라 바뀌어서 좋은 방법이 아니었습니다. ㅠ

 

 

#!/bin/sh
echo 'PARAM:' $0
RELATIVE_DIR=`dirname "$0"`
echo 'Dir:' $RELATIVE_DIR

cd $RELATIVE_DIR
SHELL_PATH=`pwd -P`
echo $SHELL_PATH
 # 실행1
 sh ./t1.sh
 
 # 결과
 
 PARAM: t1.sh
Dir: .
/root/test1


 # 실행2
 sh ./t1.sh
 
 # 결과
 
 PARAM: ./t1.sh
Dir: .
/root/test1



  # 실행3
sh /root/test1/t1.sh
 
 # 결과
 
PARAM: /root/test1/t1.sh
Dir: /root/test1
/root/test1

 

위 방법에 $0는 매개변수입니다. sh파일을 시작 시에 첫 번째 매개변수를 받는 방식입니다. 예를 들면 sh t1.sh 에 경우

t1.sh가 첫 번째 매게 변수이며 echo 'PARAM:' t1.sh 가 되는 것입니다. 또한 $1은 두 번째 인자 매개변수입니다. 

$0으로 매개변수를 받고 실행 시 해당 파일에 위치로 이동 후 절대 경로를 얻는 방식입니다.

 

다른 방법으로 readlink를 이용하는 방법이 있으며 동일한 결과를 얻을 수 있습니다.

readlink파일이나 심볼릭 링크의 대상을 출력하는 데 사용됩니다. 주로 심볼릭 링크의 대상 경로를 찾거나 확인하는 데 사용됩니다.

# readlink [옵션] [파일]

-f 또는 --canonicalize : 지정된 경로의 정규화된 절대 경로를 출력합니다.
-e 또는 --canonicalize-existing : 심볼릭 링크가 아닌 대상 파일의 정규화된 절대 경로를 출력합니다.
-n 또는 --no-newline : 출력에 새 줄을 추가하지 않습니다.
#!/bin/sh
echo 'PARAM:' $0
RELATIVE_DIR=`dirname "$0"`
echo 'Dir:' $RELATIVE_DIR

CANONICAL_DIR=`readlink -f $RELATIVE_DIR`
echo 'CANONICAL DIR:' $CANONICAL_DIR

 

 # 실행
sh t2.sh

# 결과
PARAM: t2.sh
Dir: .
CANONICAL DIR: /root/test1

 

 

 

참고