프로젝트에 대한 템플릿 셸 스크립트를 만들고 있는데, 꼭 필요한 기능 중 하나는 템플릿 구성 파일의 복사본을 새 파일로 만드는 기능입니다. 그러나 이는 정적으로 처리되지 않으며 런타임 변수를 만들고 설정합니다.( $modloader
)이는 쉘 스크립트 파일 이름에서 유래하며 템플릿을 이와 동일한 이름으로 복사합니다. 정적 파일 이름으로 몇 가지 테스트를 수행했는데 cp
잘 작동하지만 파일이 이미 있는지 확인할 때 문제가 발생하는 것 같습니다.(라인 5). 터미널에서 이것을 실행하면 검사 중인 파일이 표시되지 않습니다. 나는 그것이 좀 더 문자 그대로의 맥락에서 그것을 찾고 있다고 믿습니다.'이해하다'변수를 사용하고 있습니다.
#!/bin/sh
modloader=`basename -s .sh "$0"`
if "./Settings/$modloader.ini"; then
cp "./Settings/Template.ini" "./Settings/$modloader.ini"
fi
답변1
파일이 이미 존재하는지 확인할 때 무너지는 것 같습니다.
파일이 이미 존재하는지 확인하고 있지 않습니다. 당신의 if "./Settings/$modloader.ini";
시도달리다ini 파일. 일반적으로 파일이 이와 같이 실행되고 테스트하려는 항목에 따라 종료 상태를 반환하도록 설계된 경우 유효한 테스트일 수 있습니다.
문제의 파일을 실행하는 것이 가능하더라도 파일을 자체적으로 (비)존재하는 테스터로 만드는 것은 의미가 없습니다.
파일이 존재하는지 확인하는 쉘의 올바른 방법은 다음과 같습니다.
test -e "./Settings/$modloader.ini"
# or equivalently
[ -e "./Settings/$modloader.ini" ]
노트:
test -e
파일에 대한 테스트어떤 유형.test -e
Settings
또는 일부 관련 디렉토리(예 : 귀하의 경우)에 대한 권한이 파일이 존재하는지 확인하는 것을 허용하지 않는 경우 거짓 부정(예: 0이 아닌 종료 상태)을 제공합니다 .
또한 테스트를 무효화하려고 합니다. 코드의 줄은 다음과 같습니다.
if ! [ -e "./Settings/$modloader.ini" ]; then
if
그래도 필요하지 않습니다. ( ) cp
가 있는 GNU가 이 대신에 필요한 전부일 수 있습니다 . 이 옵션은 이식 가능하지 않으며 대상이 디렉토리(에 대한 심볼릭 링크)인 경우를 대비하여 이식 가능하지 않은 다른 옵션 ( ) 을 원할 가능성이 높습니다 .-n
--no-clobber
if … fi
-T
--no-target-directory
cp -nT "./Settings/Template.ini" "./Settings/$modloader.ini"
대상이 이미 존재하여 cp -n
작동하지 않는 경우 종료 상태는 입니다 0
. 대상이 존재하지 않고 복사가 성공하면 동일한 종료 상태를 얻게 됩니다. 이는 cp
파일의 존재 여부에 따라 (보다) 더 많은 작업을 수행하려면 if
어쨌든 사전이 필요함을 의미합니다.