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