Use pgrep
da seguinte forma:
if ! pgrep -u $USER top >/dev/null 2>&1; then
exec top
fi
Explicação:
- O utilitário
pgrep
sai 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
.