Enquanto você poderia pensar que verificar se o shell é executado no modo interativo dará o mesmo resultado, na prática, isso não é. O conceito parece semelhante, mas na verdade é diferente. Você pode executar um script interativo em feed de entrada, graças a expectativa em segundo plano. Além disso, você pode iniciar seu script com bash com o argumento -l
. Não podemos, portanto, confiar na interatividade básica para verificar se nosso script é executado em segundo plano ou em primeiro plano.
A resposta do devnull está correta . Para determinar se o processo está sendo executado em primeiro plano, o utilitário ps verifica se o processo group (pgrp) é o mesmo que o ID do grupo de processos associado ao terminal de controle da sessão (tpgid) e adiciona um sinal +
na saída de acordo com o estado do processo.
Sabendo disso, podemos definitivamente ter uma versão pura do teste:
#!/usr/bin/env bash
IFS=$' '
retval=($(</proc/$$/stat))
IFS=$' \t\n'
if [[ "${retval[3]}" == "${retval[7]}" ]]; then
echo "Background" > ./result.txt
else
echo "Foreground" > ./result.txt
fi
exit
No código acima, estamos exibindo o resultado em um arquivo de texto porque stdout
não está conectado quando um processo é executado em segundo plano.
Por favor, observe que o quarto e o oitavo elementos da tabela correspondem respectivamente a pgrp
e tpgid
( veja a seção / proc / [pid] / stat da página man - man 5 proc
).