私は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で始まる中間コードブロックの目的を理解しておらず、3番目のコメント「#cmake ...」が何をしているのかわかりません。私はcppファイルを使用していますが、そのファイルを./run.shを使用してコマンドライン引数として渡す必要があると思います。
答え1
宿題がとても複雑です。
EMBEDDED=`echo $2`
これにはスクリプトの2番目のパラメータが必要です。分割とグローブを行います。(驚きです!) その結果をに渡すと、実行されたecho
すべてのタスクの結果が割り当てられますecho
(不気味な特性のため、おそらくエコーではないでしょう。)到着するEMBEDDED
。簡単な書き込み方法を使用する方が賢明かもしれません。
EMBEDDED=$2
割当明細書。
過度に複雑なファイルパスコンポーネントの決定
DIRECTORY=`echo $1 |cut -d'/' -f1`
dirname(1)
これは、POSIXパーティションとglobを削除するwithコマンドを使用してより慎重に作成できます""
。なぜなら、分割とグロブが割り当てられた内容を汚染する結果を生み出すことを(驚くべきことに!)望まないかもしれないからです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
確認とその後の作業の間に異なる問題がある可能性があるため、これは原子的ではありません。したがって、もう1つのアプローチは、「ディレクトリを作成し、結果を確認して失敗(悪い)またはディレクトリにあるか(良い)を確認することです。また、失敗を確認し、POSIXのパーティション化とglobイベントを防ぐために引用します。-d
mkdir
EEXIST
cd
$TARGET