Estou tentando escrever um make
comando Linux simples com scripts bash. aqui está o que escrevi até agora:
#!/usr/bin/env bash
function make_cmd()
{
read target colon sources
for src in $sources; do
if [ $src -nt $target ]; then
while read cmd && [[ $(echo "$cmd" | grep "$(printf '\t')"*) ]]; do
echo "executing $cmd";
eval ${cmd#$(printf '\t')};
done
break;
fi
done
}
este é o formato de entrada:
target.file : source.file
[tab]command
por exemplo:
target.txt : source.txt
ls
cd
o script funciona bem, mas não consegue encontrar comandos começando com tab. sempre os executa. por exemplo, os comandos nesta entrada ainda são executados.
target.txt : source.txt
ls
cd
Como posso consertar isso?
O
read
comando interno divide palavras usando o valor deIFS
, que por padrão contém um espaço, uma tabulação e uma nova linha. Portanto, ao usarread
para obter a entrada, a guia é removida.Comece a função com:
Agora apenas espaços separarão as palavras. No final da função, restaure o IFS ao seu valor original:
Observe que você pode usar uma tabulação literal se escapar por uma barra invertida. Além disso, eu não usaria
grep
para corresponder à guia, use builtins sempre que possível, pois é mais rápido. Minha versão da função seria:O
$'\t'
substitui uma tabulação literal (graças a Kusalananda pela dica).Insira uma tabulação literal após a
#
substituição da variável. Usar oprintf
pode ser mais legível.