Eu fiz algumas investigações. De acordo com o código fonte do bash.
TL; DR
How is a non-interactive shell defined?
- falta de histórico de comandos
- trabalhos não são suportados
- sem recurso de edição de linha
- os erros recebem o número da linha
- sem aviso
- a execução é interrompida após o primeiro erro
Does bash -c (without additional -i option) always create a non-interactive shell?
Sim
Versão mais longa.
Esta função é chamada quando o bash recebe a opção -c
.
no_line_editing = 1
significa que você não pode editar seus comandos usando backspace.
bash_history_reinit (0);
desativa o histórico e o preenchimento automático dos comandos.
static void
init_noninteractive ()
{
#if defined (HISTORY)
bash_history_reinit (0);
#endif /* HISTORY */
interactive_shell = startup_state = interactive = 0;
expand_aliases = posixly_correct; /* XXX - was 0 not posixly_correct */
no_line_editing = 1;
#if defined (JOB_CONTROL)
/* Even if the shell is not interactive, enable job control if the -i or
-m option is supplied at startup. */
set_job_control (forced_interactive||jobs_m_flag);
#endif /* JOB_CONTROL */
}
O controle de trabalho está desativado por padrão, a menos que você o force com -m
/* We can only have job control if we are interactive unless we
force it. */
if (interactive == 0 && force == 0)
{
job_control = 0;
original_pgrp = NO_PID;
shell_tty = fileno (stderr);
}
Mensagens de erro de sintaxe contêm números de linha.
/* Report a syntax error with line numbers, etc.
Call here for recoverable errors. If you have a message to print,
then place it in MESSAGE, otherwise pass NULL and this will figure
out an appropriate message for you. */
static void
report_syntax_error (message)
char *message;
{
...
if (interactive == 0)
print_offending_line ();
...
}
Teste simples
root@test:~# ;;
-bash: syntax error near unexpected token ';;'
root@test:~# bash -c ';;'
bash: -c: line 0: syntax error near unexpected token ';;'
bash: -c: line 0: ';;'
O prompt não é impresso após a execução do comando.
/* Issue a prompt, or prepare to issue a prompt when the next character
is read. */
static void
prompt_again ()
{
char *temp_prompt;
if (interactive == 0 || expanding_alias ()) /* XXX */
return;
A execução do comando é interrompida após o primeiro erro.
/* Parse error, maybe discard rest of stream if not interactive. */
if (interactive == 0)
EOF_Reached = EOF;