Isso não é seguro.
Você não especificou qual é o problema que está tentando resolver. Se o seu problema é que você quer que seu diretório esteja sempre lá, mas seja limpo de vez em quando, sugiro remover explicitamente arquivos mais antigos que um arquivo de verificação (o sleep 1 é que eu sou paranóico):
touch regression.delete \
&& find regression \! -newer regression.delete -delete & \
&& sleep 1 \
&& run_regression
Isso terá problemas se você tiver subdiretórios, você pode escrever
touch regression.delete \
&& find regression -mindepth 1 -maxdepth 1 \! -newer regression.delete -exec rm -rf '{}' \; & \
&& sleep 1 \
&& run_regression
Se o seu problema é que você quer iniciar seu programa o mais rápido possível, se a ausência momentânea do diretório for possível e não for um ponto de montagem, eu geralmente executo algo como
mkdir regression.new \
&& chmod --reference regression regression.new \
&& mv regression regression.delete \
&& mv regression.new regression \
&& rm -rf regression.delete & \
run_regression
Isso deve permitir que você inicie a run_regression quase instantaneamente.
Respondendo a sua edição (e editando-me seguindo a pesquisa em outra resposta), curingas devem ser expandidos antes que o comando rm
seja iniciado, mas o ponto crucial de seu problema é saber se a expansão é feita após os forks do shell. A especificação POSIX da execução assíncrona não especifica explicitamente de uma forma ou de outra, tanto quanto eu posso veja, e a seção 2.1 certamente implica que a expansão é uma operação distinta e anterior ao fork real / exec do comando, mas o teste (por @adonis, replicado por mim usando bash 4.3.42 (1)) mostra que o bash é o mais eficiente maneira: se a expansão curinga leva tempo, então as modificações executadas pelo comando a seguir podem influenciar essa expansão. Sua idéia original, portanto, corre o risco de excluir arquivos que você não deseja excluir.
Eu olhei para o bash source, e o execute_cmd.c explicitamente afirma que a bifurcação é feita antes da expansão de palavras:
3922 | /* If we're in a pipeline or run in the background, set DOFORK so we
3923 | make the child early, before word expansion. This keeps assignment
3924 | statements from affecting the parent shell's environment when they
3925 | should not. */