tarefa excessivamente complicada
EMBEDDED='echo $2'
Isso leva o segundo argumento para o script e executa um split e um glob nele (surpresa!) e passa o resultado disso para echo e então atribui o resultado de qualquer echo (o que, devido a featurism rastejando, pode não ser um eco ) para EMBEDDED . Isto é provavelmente mais sensivelmente escrito usando um simples
EMBEDDED=$2
declaração de atribuição.
determinação de componentes de caminho de arquivo excessivamente complicada
DIRECTORY='echo $1 |cut -d'/' -f1'
Isso pode ser escrito com mais atenção usando o comando dirname(1) com também "" para eliminar o split POSIX e glob como um provavelmente não quer os resultados da divisão (surpresa) e do glob que são atribuídos a DIRECTORY .
DIRECTORY='dirname "$1"'
No entanto, dirname e cut -d'/' -f1 não são iguais, a menos que a única entrada seja somedirectory/somefile . Alguém precisaria entender as entradas para o código para saber se a simplificação para dirname pode ser feita. As entradas esperadas não estão documentadas no roteiro postado na pergunta - elas estão documentadas em algum lugar?
Em uma nota relacionada, há um comando basename(1) que pode ajudar com
FILENAME='echo $1 |cut -d'/' -f2 |cut -d'.' -f1 | sed -e "s|/|_|g"'
embora apareça este pipeline com cut -d'.' -f1 tentando obter um prefix de prefix.whatever , e não tenho idéia para qual sed -e "s|/|_|g" serve, pois / não pode aparecer em nomes de arquivos. Se houver _ no argumento sendo passado, seria mais sensato passá-las como _ e não adicionar código extra para alterar / em _ . Então, provavelmente, o acima poderia ser simplificado para
FILENAME='basename "$1" | cut -d'.' -f1'
comandos desnecessariamente perigosos
mkdir build
cd build
rm bin/${TARGET}
Esta sequência pode ou não criar um diretório build e, em seguida, tentará excluir várias coisas do novo diretório build ou da falha do pai dele. Isso é desleixado e indeterminado. E por várias coisas quero dizer que ${TARGET} será expandido com o POSIX shell split e glob, então pode conter nomes de arquivos bastante inesperados - por sorte o rm não é o usual "oh sim, sobre esse sistema de arquivos que você acabou de perder" rm -rf então a hilaridade será limitada a vários (ainda surpreendentes!) nomes de arquivos, possivelmente do diretório errado.
(Alguns podem argumentar que o gerenciamento de configuração ou pelo menos comandos protegidos deve ser usado em vez de scripts de shell frágeis e propensos a erros , mas aqui estamos nós ...)
[ -d build ] || { mkdir build; [ -d build ] || exit 1; }
cd build || exit 1
rm bin/"${TARGET}"
cmake .. -DSRC=../"$1" && make VERBOSE=1 && bin/"${TARGET}"
Aqui build é um diretório, é feito como um diretório ou, na sua falta, o script aplica (você também pode adicionar uma mensagem de erro personalizada, embora o mkdir normalmente faça ruído). Isso não é atômico, pois algo mais poderia touch build entre a -d check e subseqüente mkdir , então outra abordagem é "fazer o diretório e então inspecionar o resultado para ver se foi uma falha (não ok) ou EEXIST em um diretório (ok). cd também é verificado quanto a falhas, e $TARGET cotado para evitar a divisão POSIX e glob do POSIX.