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

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

일부 배치 스크립트를 쉘 스크립트로 변환하는 중입니다. 배치 스크립트에는 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가 알 수 있듯이 실행할 명령 바로 앞에 관련 디렉터리에 대한 검사를 추가할 수 있습니다.

관련 정보