Use pgrep da seguinte forma:
if ! pgrep -u $USER top >/dev/null 2>&1; then
exec top
fi
Explicação:
- O utilitário
pgrepsai com um código de saída zero se o comando puder ser encontrado em execução. Portanto, negue o teste. - Também restrinja-o ao usuário atual com
-u $USER, para que, por algum motivo, ele não atenda aos processos de outra pessoa.$USERé uma variável de shell padrão. Se por algum motivo isso não estiver definido, tente usar$LOGNAME, e se isso falhar, use$( id -n -u )(mas, nesse ponto, você deve se perguntar o que está acontecendo, porque$LOGNAMEé também uma variável de shell padrão). - Não precisamos da saída de
pgrep, portanto, redirecione a saída padrão e os fluxos de erro para/dev/null.
Se top (ou qualquer outro) não estiver em execução, exec para substituir o shell, de acordo com a pergunta do OP.
Isso deve estar funcionando em todos os shells compatíveis com sh .
EDIT: A implementação de pgrep em sistemas BSD (OS X, OpenBSD, ...) possui uma opção -q que faz com que seja descartada qualquer saída, mas o pgrep no Linux aparentemente não possui este sinalizador . Em sistemas BSD, use este e não o redirecionamento levemente feio para /dev/null .