A sintaxe de substituição de comando, $(), é considerada um operador ou um comando?

A sintaxe de substituição de comando, $(), é considerada um operador ou um comando?

Não consigo encontrar nenhuma documentação oficial que se refira a isso como um ou outro. Afinal, qual é exatamente a distinção técnica entre um comando e um operador?

Responder1

O texto em POSIX lista-o em2.6 Expansões de palavras, junto com Expansão de Til, Expansão de Parâmetros, Expansão Aritmética, Divisão de Campo, Expansão de Nome de Caminho e Remoção de Cotação.

Da mesma forma, o manual do Bash lista-o emExpansões de Shell.

O primeiro usa "operador" para operadores de redirecionamento e ;, &, , |, &&, ||etc. (, portanto não é um deles. Obviamente, também não é um comando, então, por mais que a terminologia importe, devo dizer que não é nenhum desses.

Responder2

Um comando:

  • geralmente tem uma string alfanumérica para seu nome.

  • é um utilitário externo, um interno ou uma função. Quase tudo typepara o qual o builtin produz saída é um comando nesse sentido.

  • temprefixonotação.

  • geralmente altera algum tipo de E/S.

Um operador:

  • geralmente é uma string simbólica e pode não ter nome, mas pode ter um apelido.

  • não é compreendido pelo typebuiltin (a menos que haja alguma função ou script com nome confuso).

  • mais frequentemente teminfixoousufixosintaxe.

  • às vezes direciona a E/S como um guarda de trânsito, mas não muda o que está acontecendo.emisto.

  • às vezes direciona a ordem dos processos.

$()é um comandosubstituição:

  • em primeiro lugar (ou por último, dependendo de como olhamos para isso), é uma string.
  • a string é composta pelo textosaídados comandos listados dentro.

[é um comando interno do shell:

  • é o testcomando com sufixo obrigatório ].

[[é uma bashpalavra-chave shell:

  • É como um [integrado mais versátil e rápido, mas SFAIK sem nenhum testcomando correspondente.
  • palavras-chave shell incluem coisas como timee for, que se parecem com comandos, mas se comportam mais como operadores que exigem várias palavras-chave irmãs como delimitadores e sintaxe. Este código executa o typebuiltin na saída do helpbuiltin, que mostra uma lista de palavras-chave e builtins do lado esquerdo:

    COLUMNS=30 help -m | tail -n +9 | 
    tee >(cut -d ' ' -f2) >(cut -c 17-30 | cut -d ' ' -f1) > /dev/null | 
    sort | sed -n "s/.*/type '&'/e"';/found/!p'
    

Comparando-o com uma língua falada:

  • comandos (e algumas palavras-chave) são como verbos.
  • arquivos e strings são substantivos.
  • operadores são como pontuação e preposições.

Em resumo, os operadores são apenas comandos com sintaxe diferente que podem ser substituídos por comandos semelhantesprefixocomandos de estilo junto com o resto deles. Provavelmente não seria tão conveniente de usar.

Analiticamente, o código compilado de um shell poderia ser executado através de um desmontador, e os operadores são novamente apenas comandos, ou melhor, uma série de comandos em linguagem assembly.

Responder3

Da perspectiva do usuário, uma substituição de comando é uma espécie de shell primitivo. É um recurso implementado no shell que realiza diversas ações (inicia um subshell, executa um comando...) e retorna um valor (a saída do comando). Antes que o shell execute expansões, uma substituição de comando geralmente é o argumento de um comando. Em outras palavras, o usuário obtém o resultado de um processo shell usando um recurso shell.

informação relacionada