기록

[issue] 쉘스크립트에서는 상대경로 대신 절대경로를 사용하자. 본문

DevOps

[issue] 쉘스크립트에서는 상대경로 대신 절대경로를 사용하자.

youngyin 2024. 7. 8. 12:00

서론

배포용 스크립트를 작성하던 중에, 파일 경로를 상대경로로 지정해서 한참이나 고생했던 경험이 있습니다. 스크립트를 외부에서 실행할수 있도록 하려면, 절대경로를 사용하는 것이 적절합니다.

1. 문제상황

(1) 문제가 있는 스크립트 소스

아래는 상대경로를 사용하여 파일을 읽고 쓰는 쉘 스크립트의 예시입니다.

#!/bin/bash

# 상대경로로 파일 읽기
input_file="data.txt"
output_file="output.txt"

if [ -f "$input_file" ]; then
    cat "$input_file" > "$output_file"
    echo "파일이 성공적으로 복사되었습니다."
else
    echo "파일이 존재하지 않습니다."
fi


(2) 문제상황의 설명

위 스크립트는 상대경로를 사용하여 파일을 읽고 쓰고 있습니다. 하지만 이 스크립트를 다른 디렉토리에서 실행하면 파일을 찾을 수 없어서 오류가 발생할 수 있습니다. 이는 상대경로가 현재 작업 디렉토리에 의존하기 때문입니다.

(3) 파일구조

/home/user/project/
├── data.txt
├── copyFile.sh
└── logs/

2. 개선된 상황


(1) 개선된 스크립트 소스

절대경로를 사용하도록 스크립트를 변경하면 이러한 문제를 해결할 수 있습니다.


#!/bin/bash

# 절대경로로 파일 읽기
input_file="/home/user/project/data.txt"
output_file="/home/user/project/output.txt"

if [ -f "$input_file" ]; then
    cat "$input_file" > "$output_file"
    echo "파일이 성공적으로 복사되었습니다."
else
    echo "파일이 존재하지 않습니다."
fi


(2) 개선사항 설명

절대경로를 사용하면 스크립트가 어떤 디렉토리에서 실행되더라도 항상 올바른 파일을 참조할 수 있습니다. 이는 파일 경로가 명확하게 지정되기 때문입니다.

(3) 리눅스에서 파일의 절대경로 구하는 방법

리눅스에서 파일의 절대경로를 구하려면 `readlink` 명령어를 사용할 수 있습니다. 예를 들어, 현재 디렉토리에 있는 `file.txt`의 절대경로를 구하려면 다음과 같이 입력합니다.

readlink -f file.txt


이 명령어는 `file.txt`의 절대경로를 출력합니다. 이 값을 스크립트에 사용하여 절대경로를 지정할 수 있습니다.

Comments