Em:
eval "$(./program.sh)"
O shell executaria ./program.sh
com seu stdout redirecionado para um pipe, e no outro extremo do pipe iria ler essa saída na memória. E então, uma vez que ./program/sh
tenha desaparecido (fazendo com que eof seja visto naquele canal e o subsequente wait()
feito pela maioria do shell no processo retorne), esse conteúdo salvo, menos o caractere de nova linha à direita, seria passado para eval
.
Portanto, para ./program.sh
detectar essa situação, seria necessário:
- detecta que sua stdout é um pipe. Isso é fácil. No Linux, isso poderia estar com
[ -p /dev/stdout ]
. - que é um processo de shell que está lendo na outra extremidade desse pipe. Isso se torna mais complicado. No Linux com um
lsof
recente, você poderia procurar na saída delsof +E -Fca -ap "$$" -d 1
para um processo cujo nome termina comsh
que tem o canal aberto para leitura em um fd acima de 10. - Em seguida, você precisaria determinar que esse processo de shell está interpretando atualmente uma linha de comando
eval something
. Para isso, você provavelmente precisará anexar um depurador a esse shell e entender as estruturas de dados internas desse shell específico para ver qual comando está realmente em execução.
Em suma, você não pode. Mas talvez você possa se contentar em dar uma saída diferente quando a saída vai para um tty e quando não, o que deve ser apenas uma questão de:
if [ -t 1 ]; then
echo output for tty
else
echo output for something else
fi