저는 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'/' -f1
somedirectory/somefile
dirname
basename(1)
관련 메모에는 도움이 될 수 있는 명령이 있습니다.
FILENAME=`echo $1 |cut -d'/' -f2 |cut -d'.' -f1 | sed -e "s|/|_|g"`
이 파이프는 from 을 얻으려고 하는 것 같지만 cut -d'.' -f1
파일 이름에 나타날 수 없기 때문에 그것이 무엇을 하는지 모르겠습니다. 전달되는 매개변수에 매개변수가 있는 경우 이를 변경하기 위해 추가 코드를 추가하는 대신 매개변수를 전달하는 것이 더 현명할 것입니다. 따라서 위의 내용은 아마도 다음과 같이 단순화될 수 있습니다.prefix
prefix.whatever
sed -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 이벤트를 방지하기 위해 인용합니다.-d
mkdir
EEXIST
cd
$TARGET