bash -c e shell não interativo [duplicado]

0

De link :

When bash is run with -c, it is considered a non-interactive shell, and it does not read ~/.bashrc, unless is -i specified.

  1. Como um shell não interativo é definido?

    • É um shell não interativo definido como um shell que não pode aceitar entrada de stdin? Por exemplo, bash -c cat pode aceitar entrada de stdin.

    • Uma saída de shell não interativa para stdout? Por exemplo, bash -c date pode gravar em stdout.

  2. O bash -c (sem a opção -i adicional) sempre cria um shell não interativo?

por Tim 17.04.2016 / 22:16

3 respostas

3

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;
    
por 18.04.2016 / 00:43
2

Dentro de uma sessão de shell, há várias opções em ou de, como:

  • os aliases são expandidos
  • é alguém / algo digitando em STDIN
  • é o sistema de conclusão carregado
  • se os comandos estiverem armazenados em um arquivo de histórico
  • quais arquivos de arquivos são originados no início do shell

Um shell interativo é um shell que possui algumas dessas características. Você pode, no entanto, ativar ou desativar essas opções ao seu gosto. Pense na palavra interactive shell como uma coleção de comportamentos que comumente entendemos precisar que um shell seja interativo.

Quando você inicia um shell com -i , fica um pouco confuso, já que geralmente indica que você está mexendo com o sistema. Pode ser que algumas dessas opções de shell tenham outro valor além do que normalmente se entende como um shell interativo.

Então, concretamente, o seu exemplo bash -c cat não terá a conclusão ativada, não armazenará nada no histórico. Eu não gostaria de chamar isso de interactive , mas você é livre para fazer isso se quiser.

    
por 17.04.2016 / 23:39
1

Um shell interativo é definido como um shell que lê os comandos do stdin.

Se um shell não interativo "definido" é interativo usando a opção -i , o arquivo $ENV ( ~/.*rc ) é indefinido.

    
por 17.04.2016 / 23:54

Tags