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.