Que fait "echo (ls)" dans bash?

Quand j'exécute echo (ls) dans bash, il returnne:

 -bash: syntax error near unexpected token `ls' 

Je comprends que je devrais échapper à la parenthèse ou à la citation pour get du text en clair. Mais le résultat n'a toujours pas de sens pour moi si la parenthèse signifie l'exécution de la séquence de commands dans un environnement sous-shell.

Mon environnement: bash 4.3 (installé par homebrew), OS X El Capitan

Il s'agit essentiellement d'une erreur de syntaxe générique, pas spécifiquement liée au jeton ls . bash utilise un parsingur yacc, qui appelle un yyerror() commun sur n'importe quel problème. Dans le error handling qui en résulte, il essaie d'identifier l'erreur. Le message provient de ce morceau (voir 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; } 

En d'autres termes, il est déjà confus par le '(' , et avoir regardé en avant pour le context, c'est rapporter le ls .

A ( serait légal au début d'une command, mais pas embedded) Par page de manuel:

  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. 

Pour en savoir plus:

  • 3.2.4.3 Commandes de regroupement (Manuel de reference Bash)
  • 3.5.4 Substitution de command (Manuel de reference Bash)

ls devrait soit être à l'intérieur des backtiks ou vous devriez essayer comme ceci:

  echo $(ls)