invocando o bash com a opção -t

1

Alguém pode me dizer sobre a opção -t ao invocar o bash?

Eu encontrei o seguinte comando útil para usar uma janela terminal leve como um lançador de aplicativos

urxvt -geometry 80x3 -name 'bashrun' -e sh -c "/bin/bash -i -t"

Por meio de uma pequena investigação de seu comportamento, vejo que -t basicamente faz o bash sair depois de executar um comando, mas estou curioso para saber se existe mais alguma opção específica para -t . Não consigo encontrar nenhuma documentação sobre isso e examinei os seguintes documentos:

Acho estranho que -t não seja tão claro quanto o restante das opções.

    
por Hari Seldon 16.03.2014 / 02:52

3 respostas

3

Você está certo de que é incrivelmente mal documentado. Que documentação existe é bastante simples:

-t      Exit after reading and executing one command.

O código-fonte bash está disponível aqui . Eu olhei para a versão 4.2. Os sinalizadores curtos manipulados pelo bash estão listados em flags.c e na linha relevante:

{ 't', &just_one_command },

Portanto, -t na linha de comando define a variável just_one_command . Esta variável é usada em apenas um lugar: ocorre em uma condição if no final de um loop em eval.c :

  if (just_one_command)
    EOF_Reached = EOF;

Em outras palavras, se o -t flag é dado, então, após o primeiro comando ser executado, a condição de final de arquivo é sinalizada e bash é encerrado.

MAIS DETALHES

A partir de eval.c , a execução da linha de comando em bash parece ser controlada pela função reader_loop :

reader_loop ()
{
  int our_indirection_level;
  COMMAND * volatile current_command;
  USE_VAR(current_command);
  current_command = (COMMAND *)NULL;
  our_indirection_level = ++indirection_level;
  while (EOF_Reached == 0)
    {
      int code;
      code = setjmp_nosigs (top_level);

      [ ... Much code removed ... ]

      if (just_one_command)
        EOF_Reached = EOF;
    }
  indirection_level--;
  return (last_command_exit_value);
}

O loop dentro de reader_loop continua até receber o sinal EOF_Reached . O único efeito da opção -t é definir esse sinalizador no final do loop, garantindo que o loop seja executado apenas uma vez.

    
por 16.03.2014 / 04:06
2

É explicado na página do manual, apenas difícil de encontrar.

As opções não mencionadas no bloco "OPÇÕES" no início são opções para set , que podem ser dadas como opções para bash, também:

The options can also be specified as arguments to an invocation of the shell.

-t      Exit after reading and executing one command.
    
por 16.03.2014 / 04:05
2

Usando o bash builtin help , ou seja, dizendo help set , você encontrará:

  -t  Exit after reading and executing one command.

Como bash analisa uma linha por vez, você pode ter vários comandos separados por ; na mesma linha e eles serão executados. Por exemplo, o seguinte:

set -t; echo Do something; echo do more; echo and more
echo no more

produziria

Do something
do more
and more

como saída. Por outro lado, o seguinte:

set -t
echo Do something
echo do more
echo and more
echo no more

não produzirá qualquer resultado.

Você pode procurar a documentação na página info . Diga:

info bash "Shell Builtin Commands"

Navegue até * Bourne Shell Builtins:: e pesquise help .

    
por 16.03.2014 / 04:20

Tags