Dê uma olhada na sua configuração se as variáveis do bash ou as opções do shell estiverem definidas:
Variáveis de Bash
( Seção 5.2 no Manual de Referência do Bash)
IGNOREEOF
Controls the action of the shell on receipt of an EOF character as the sole input. If set, the value denotes the number of consecutive EOF characters that can be read as the first character on an input line before the shell will exit. If the variable exists but does not have a numeric value (or has no value) then the default is 10. If the variable does not exist, then EOF signifies the end of input to the shell. This is only in effect for interactive shells.
Por exemplo, IGNOREEOF=2
Modificando o comportamento do shell: o conjunto incorporado
set
allows you to change the values of shell options
( Seção 4.3.1 no Manual de Referência do Bash)
-o ignoreeof
An interactive shell will not exit upon reading EOF.
Como chegar à sua pergunta
I would like to control both independently, if possible (disable this functionality for non-login shells, for instance). Is that possible?
Sim. Scripts que você fonte deve verificar se o shell é um shell de login e definir a variável de acordo, algo como isto: p>
if shopt -q login_shell; then IGNOREEOF=10; else IGNOREEOF=0; fi
Observe que o valor de 10
ainda permite que você deixe o shell com Ctrl + D ; você só precisa de 11 toques consecutivos.