Não use substituição de comando na saída defind
. Aqui, tudo pode ser feito com find
:
find . -mtime 1 -type f ! -exec lsof -t {} \; -exec rm -f {} \; > /dev/null
Com algumas find
implementações (incluindo FreeBSD de find
onde vem e GNU find
), você pode usar em -delete
vez de -exec rm...
.
A razão pela qual você está recebendo um erro é que não há comando entre then
e else
alguns shells (começando com o shell Bourne de onde vem essa sintaxe) exigem pelo menos um (e um comentário não é um comando). Note que é completamente arbitrário e não há razão para que essas conchas fariam isso. yash
e zsh
não tem essa limitação (if false; then else echo x; fi
e até if false; then else fi
funciona bem com eles).
Como já foi dito, você pode usar um comando noop como :
(ou for nothing in; do nothing; done
) ou reverter a lógica com a !
palavra - chave (disponível nos shells POSIX, mas não no shell Bourne (você verá que o uso :
disso era comum nesse shell)). mksh
e por yash
acaso o suporte if false; then () else echo x; fi
(eu não confiaria nisso, pois isso pode mudar em versões futuras).
Outra abordagem é com:
lsof... || {
cmd1
cmd2
}
embora uma diferença é o status geral de saída que será a de lsof
se lsof
falhar.
-exec
frequentemente seja útil,xargs
algumas vezes é necessário um loop de shell. Nesse caso, umwhile read name
loop é a opção preferida (no bash com o GNU find, você pode usar a opção -0 para ambos; portably, você deve desistir da nova linha).-print0
é-exec printf '%s\0' {} +
(mas, de maneira portável, você não pode lidar com essa saída, exceto se quiser considerarperl
), e comfind .//.
e algum pós-processamento, você pode escapar das novas linhas paraxargs
. Note que não é umwhile read
, éwhile IFS= read -r
.Parece que você deseja fazer um no-op se o arquivo estiver aberto, então você deve adicionar um
:
comando que é nulo embash
:Se você não usar
:
,bash
não poderá analisar seu código e mostrará um erro comobash: syntax error near unexpected token 'else'
.fonte
:
e é o primeiro comando listado em bash-builtins.Outra alternativa: inverta sua lógica.
fonte
TL; DR
Nenhuma das outras respostas realmente responde à sua pergunta original sobre por que o comando fornece um erro de sintaxe. Isso é causado por um comando ausente entre então e mais .
Um comando ausente
Seu código original é assim:
O problema é que você tem um comentário entre então e outra coisa , mas o comentário não é tratado como um comando. Em resumo, você pode reescrever o problema que possui (estruturalmente falando) da seguinte maneira:
Corrija sua sintaxe com um Bourne interno
Você pode corrigir esse problema, colocando comandos reais antes de outra pessoa , mas um comentário por si só não vai fazer. A seção se-então não pode estar vazia; se você quiser um espaço reservado, use os dois pontos incorporados . Por exemplo:
Simplesmente colocar
:
na seção entre então e outra coisa corrigirá o erro de sintaxe que você está enfrentando.fonte
$ ; -bash: syntax error near unexpected token ';'