O que faz “echo (ls)” no bash?

6

Quando executo echo (ls) no bash, ele retorna:

-bash: syntax error near unexpected token 'ls'

Eu entendo que devo sair de parênteses ou citar para obter uma saída de texto simples. Mas o resultado ainda não faz sentido para mim, se parênteses significa executar a seqüência de comandos em um ambiente subshell.

Meu ambiente: bash 4.3 (instalado pelo homebrew), OS X El Capitan

    
por xzhao 27.12.2015 / 17:20

2 respostas

12

É essencialmente um erro genérico de sintaxe, não especificamente relacionado ao token ls . bash usa um analisador yacc, que chama um yyerror() comum em qualquer problema. Dentro do tratamento de erros resultante, ele tenta localizar o erro. A mensagem está vindo deste pedaço (veja source ):

  /* If the line of input we're reading is not null, try to find the       
     objectionable token.  First, try to figure out what token the
     parser's complaining about by looking at current_token. */
  if (current_token != 0 && EOF_Reached == 0 && (msg = error_token_from_token (current_token)))
    {
      if (ansic_shouldquote (msg))
    {
      p = ansic_quote (msg, 0, NULL);
      free (msg);
      msg = p;
    }
      parser_error (line_number, _("syntax error near unexpected token '%s'"), msg);
      free (msg);

      if (interactive == 0)
    print_offending_line ();

      last_command_exit_value = parse_and_execute_level ? EX_BADSYNTAX : EX_BADUSAGE;
      return;
    }

Em outras palavras, ele já está confuso com o '(' e, se o contexto tiver sido visto com antecedência, está relatando o ls .

Um ( seria legal no início de um comando, mas não incorporado. Por página de manual:

   Compound Commands                                                       
       A compound command is one of the following:

       (list) list  is  executed in a subshell environment (see COMMAND EXECU‐
              TION ENVIRONMENT below).  Variable assignments and builtin  com‐
              mands  that  affect  the  shell's  environment  do not remain in
              effect after the command completes.  The return  status  is  the
              exit status of list.

Leitura adicional:

por 27.12.2015 / 17:49
3

ls deve estar dentro de backtiks ou você deve tentar assim:

    echo $(ls)
    
por 27.12.2015 / 19:10

Tags