.sh 파일 용어 및 cmake 이해

.sh 파일 용어 및 cmake 이해

저는 cmake와 OpenGL을 사용하여 컴퓨터 그래픽을 배우려고 하는데, 튜토리얼에는 cpp 프로그램을 컴파일/빌드하는 데 사용되는 run.sh 파일이 포함되어 있습니다. 코드는 다음과 같습니다.

#!/bin/bash
#calls cd build 
#cmake .. -DSRC<argument> && make argument

EMBEDDED=`echo $2`
DIRECTORY=`echo $1 |cut -d'/' -f1`
FILENAME=`echo $1 |cut -d'/' -f2 |cut -d'.' -f1 | sed -e "s|/|_|g"`
TARGET=${FILENAME}

mkdir build
cd build
rm bin/${TARGET}
cmake .. -DSRC=../$1
make VERBOSE=1
bin/${TARGET}

내 이해에 따르면 mkdir은 빌드 디렉토리를 생성한 다음 해당 디렉토리로 "cd"하고 이전 빌드에서 일부 항목을 삭제하고 실제 파일을 cmake합니다. make "VERBOSE=1"이 무엇을 하는지 모르겠습니다. 그런 다음 우리는 마지막 줄의 실행 파일에 액세스합니다.

EMBEDDED로 시작하는 중간 코드 블록의 목적을 이해하지 못하고 세 번째 주석 "#cmake ..."가 무엇을 하는지 잘 모르겠습니다. 저는 cpp 파일을 사용하고 있는데 해당 파일을 ./run.sh를 사용하여 명령줄 인수로 전달해야 한다고 생각합니다.

답변1

숙제가 너무 복잡해요

EMBEDDED=`echo $2`

이를 위해서는 스크립트의 두 번째 매개변수가 필요합니다.분할 및 글로브를 수행합니다.(놀랍네요!) 그 결과를 에 전달하면 echo수행된 모든 작업의 ​​결과가 할당됩니다 echo(소름끼치는 특성으로 인해,아마 에코가 아니겠지) 도착하다 EMBEDDED. 간단한 글쓰기 방법을 사용하는 것이 더 현명할 수도 있습니다.

EMBEDDED=$2

할당 명세서.

지나치게 복잡한 파일 경로 구성 요소 결정

DIRECTORY=`echo $1 |cut -d'/' -f1`

dirname(1)이는 POSIX 분할 및 glob을 제거하는 with 명령을 사용하여 더 주의 깊게 작성할 수 있습니다 "". 왜냐하면 분할 및 glob이 할당된 내용을 오염시키는 결과를 생성하는 것을 (놀랍게도!) 원하지 않을 수 있기 때문입니다 DIRECTORY.

DIRECTORY=`dirname "$1"`

그러나 유일한 입력이 가 아니면 은 동일하지 dirname않습니다 . 코드를 단순화할 수 있는지 알려면 누군가 코드 입력을 알아야 합니다 . 예상되는 입력은 질문에 게시된 스크립트에 문서화되어 있지 않습니다. 어디에도 기록되어 있습니까?cut -d'/' -f1somedirectory/somefiledirname

basename(1)관련 메모에는 도움이 될 수 있는 명령이 있습니다.

FILENAME=`echo $1 |cut -d'/' -f2 |cut -d'.' -f1 | sed -e "s|/|_|g"`

이 파이프는 from 을 얻으려고 하는 것 같지만 cut -d'.' -f1파일 이름에 나타날 수 없기 때문에 그것이 무엇을 하는지 모르겠습니다. 전달되는 매개변수에 매개변수가 있는 경우 이를 변경하기 위해 추가 코드를 추가하는 대신 매개변수를 전달하는 것이 더 현명할 것입니다. 따라서 위의 내용은 아마도 다음과 같이 단순화될 수 있습니다.prefixprefix.whateversed -e "s|/|_|g"/__/_

FILENAME=`basename "$1" | cut -d'.' -f1`

불필요하게 위험한 명령

mkdir build
cd build
rm bin/${TARGET}

이 시퀀스는 디렉터리를 생성할 수도 있고 생성하지 않을 수도 있으며, 그런 다음 build새 디렉터리에서 다양한 콘텐츠를 삭제하려고 시도하거나, 실패할 경우 해당 디렉터리의 상위 디렉터리를 삭제하려고 시도합니다. build이것은 성급하고 불확실합니다. 내가 의미하는 다양한 것은 ${TARGET}POSIX 쉘 분할 및 glob을 통해 확장되므로 매우 예상치 못한 파일 이름이 포함될 수 있다는 것입니다. 운 좋게도 이것은 rm일반적인 "아 예, 방금 파일 시스템을 잃어버린 것에 대한 것"이 아니므 rm -rf로 재미는 다음과 같습니다. 다양한(여전히 놀라운!) 파일 이름으로 제한되며, 잘못된 디렉토리에 있을 수도 있습니다.

(어떤 사람들은 구성 관리를 생각하거나 적어도보호된 명령부서지기 쉽고 오류가 발생하기 쉬운 쉘 스크립트 대신 사용해야 하지만 여기서는...)

[ -d build ] || { mkdir build; [ -d build ] || exit 1; }
cd build || exit 1
rm bin/"${TARGET}"
cmake .. -DSRC=../"$1" && make VERBOSE=1 && bin/"${TARGET}"

이것은 build디렉토리이고, 디렉토리로 만들어졌거나 스크립트가 실패했습니다. mkdir일반적으로 시끄럽기는 하지만 사용자 정의 오류 메시지를 추가할 수도 있습니다. touch build확인과 후속 작업 사이에 다른 문제가 있을 수 있으므로 이는 원자적이지 않습니다 . 따라서 또 다른 접근 방식은 "디렉토리를 생성한 다음 결과를 확인하여 실패(나쁨) 또는 디렉터리에 있는지(양호) 확인하는 것입니다. 또한 실패를 확인하고 POSIX 분할 및 glob 이벤트를 방지하기 위해 인용합니다.-dmkdirEEXISTcd$TARGET

관련 정보