As far I know, there are 3 ways to see exported variables:
$ export -p | wc -l
50
$ env | wc -l
51
$ printenv | wc -l
51
As you can see, export -p misses single variable. It's a $_ one:
$ diff <(export -p |sed 's/declare -x //' | sed 's/"//g' | sort) <(printenv | sort)
41a42
> _=/usr/bin/printenv
$_ is special variable set to final argument of previous command executed. Why export -p doesn't include it, unlike two other commands?
Edit
I understand that exporting $_ might not have any sense but if $_ is not exported then why it appears in printenv output? printenv prints environment variables, environment variables are exported ones, $_ is not exported. Am I missing something here?