쉘 스크립트는 절대 경로 또는 상대 경로와 함께 작동해야 합니까?

쉘 스크립트는 절대 경로 또는 상대 경로와 함께 작동해야 합니까?

일부 배치 스크립트를 쉘 스크립트로 변환 중입니다. 배치 스크립트에는 cd 명령이 있지만 여전히 절대 경로를 사용합니다.

foo.bat:

pushd
cd C:\some\directory
copy C:\some\directory\foo.txt C:\some\other\directory
popd

복사되는 파일이 절대 경로를 사용하여 호출되기 때문에 이 스크립트의 CD는 중복된 것 같습니다. 이것을 쉘 스크립트로 변환해야 합니다. 다음 두 가지 옵션이 있습니다.

test1.sh:

cp /some/directory/foo.txt /some/other/directory

test2.sh:

cd /some/directory
cp foo.txt /some/other/directory

첫 번째는 cp와 절대 경로만 사용하고, 두 번째는 cd와 상대 경로를 사용합니다.

내 질문은: 쉘 스크립트에서 경로를 사용할 때 이 두 가지 예 중 어느 것이 더 나은 접근 방식입니까?

부가적인 질문으로, 이 예에서는 pushd/popd가 필요합니까?

답변1

스크립트를 호출하는 것이 반드시 나쁜 것은 아니지만 cd주의를 기울여야 합니다. 여러 번 호출하면 cd"코드 냄새"가 발생할 수 있습니다. 일반적으로 절대 경로가 바람직합니다.

cd실패할 수 있습니다. 오류를 올바르게 처리해야 합니다.

호출 후에는 cd상대 경로가 유효하지 않게 됩니다. 특히, 무언가를 준비한 다음 다른 명령을 실행하기 위해 래퍼 스크립트를 작성하는 경우 절대 호출하지 마십시오 cd. 사용자는 원래 디렉터리에서 실행되는 명령에 의존할 수 있습니다. 스크립트가 명령줄에 전달된 파일 이름을 사용하는 경우 일반적으로 원래 디렉터리에 상대적입니다. "$PWD/"앞에 절대값을 추가할 수 있지만 이로 인해 문제가 발생하면 오류 메시지가 표시됩니다.

이 변수에는 PWD항상 현재 디렉터리가 포함되어 있으므로 이를 다른 변수에 저장하고 cd나중에 호출할 때 다시 변경할 수 있습니다. 그러나 원래 디렉터리로의 변경을 허용하지 않는 낮은 권한으로 실행되는 스크립트나 스크립트가 실행되는 동안 이동된 디렉터리와 같은 일부 극단적인 경우에는 이 작업이 실패할 수 있습니다.

상대 경로에 유의하세요. 로 시작할 수 있으며, 예방 조치를 취하지 않으면 -로 시작하는 명령 매개변수가 옵션으로 해석됩니다. -절대 경로에는 이 문제가 없습니다.

답변2

내 경험에 따르면 이는 대부분 사용자의 필요와 선호도에 따라 달라지며
많은 문서에서 이를 사용자에게 맡깁니다. 이것이 내가 알아차린 것입니다:

  • 절대 경로가 더 명확해졌습니다. 스크립트를 유지/수정해야 하는 사람(귀하 또는 다른 사람)은 매번 어떤 디렉토리가 관련되어 있는지 알 수 있습니다.
  • 절대 경로를 사용하면 관련된 디렉토리가 스크립트에 작성한 정확한 경로를 가진 디렉토리인지 확인할 수 있습니다.
  • 상대 경로는 더 짧지만 작업 중인 하위 트리를 결정해야 합니다.
  • 스크립트 시작 부분에서 반복되는 경로를 변수로 바꾸면 간결해질 수 있습니다(예: /var/log/app/comComponent/module/logfile.log -> $module_log_dir/logfile.log).

thrig에서 알 수 있듯이 실행하려는 명령 앞에 관련된 디렉터리에 대한 검사를 추가할 수 있습니다.

관련 정보