terminologia da linha de comando: como são chamadas essas partes de um comando?

21

Na linha de comando, costumo usar comandos "simples" como

mv foo/bar baz/bar

mas não sei como chamar todas as partes disso:

┌1┐ ┌──2───┐
git checkout master
│   └──────3──────┘
└───────4─────────┘

Eu (acho que) sei que 1 é um comando e 2 é um argumento, e provavelmente chamaria 3 de uma lista de argumentos (isso está correto?).

No entanto, não sei como chamar 4 .

Como os "comandos" mais complexos são rotulados?

find transcripts/?.? -name '*.txt' | parallel -- sh -c 'echo $1 $2' {} {/}

Eu apreciaria uma resposta que detalha o que chamar 1,2,3,4 e o que chamar cada parte deste, por exemplo, este "comando" acima.

Seria ótimo aprender também sobre outras coisas únicas / surpreendentes que eu não incluí aqui.

theonlygusti
fonte
1
Você já olhou as manpáginas gite find, em particular, a seção de sinopse?
precisa saber é
4
Você já olhou para as páginas de manual para git e encontrar Portanto, a questão parece nada a ver com gitou findterminologias bastante geral para linux.
Att Righ
De acordo com a página man bash em A | B, A | Bé um gasoduto , Ae Bsão comandos (é uma pena que isso tem o mesmo nome que apenas o primeiro mundo em um comando). Eu poderia chamar o primeiro argumento de executável, mas não consigo encontrar uma fonte que concorde comigo.
precisa
4
No contexto de git checkout ..., checkouté um subcomando e, no contexto de sh -c ..., -cé uma opção .
Wjandrea
@JoL obrigado por apontar isso. Você adivinhou certo, eu editei isso. É porque eu re-escreveu que a seção cerca de 4 vezes enquanto eu tentava fazê-lo corretamente
theonlygusti

Respostas:

33

Os nomes comuns para cada parte são os seguintes:

┌1┐ ┌──2───┐
git checkout master
│   └──────3──────┘
└───────4─────────┘
  1. Nome do comando (primeira palavra ou token da linha de comando que não é um redirecionamento ou atribuição de variável e depois que os aliases foram expandidos).

  2. Token, palavra ou argumento para o comando. De man bash:

    palavra: uma sequência de caracteres considerados como uma única unidade pelo shell. Também conhecido como um token.

  3. Geralmente: Argumentos

  4. Linha de comando.

A concatenação de dois comandos simples com a |é uma sequência ou canal de tubulação:

┌─1┐ ┌──────2──────┐ ┌─2─┐ ┌──2──┐   ┌──1───┐ ┌2┐┌2┐┌2┐┌────2─────┐ ┌2┐ ┌2┐
find transcripts/?.? -name '*.txt' | parallel -- sh -c 'echo $1 $2'  {} {/}
│    └────────────3──────────────┘            └────────────3──────────────┘
└───────────────────────────────────4─────────────────────────────────────┘

Lembre-se de que também existem redirecionamentos e atribuições de variáveis:

┌──5──┐ ┌1┐ ┌─2─┐ ┌─2─┐   ┌───6──┐ ┌1┐ ┌─5─┐
<infile tee file1 file2 | LC_ALL=C cat >file
└─────────7───────────┘   └───────7────────┘
└─────────────────────4────────────────────┘

Onde (ao lado dos números acima):

  1. redirecionamento.
  2. Atribuição variável.
  3. Comando simples.

Esta não é uma lista exaustiva de todo o elemento que uma linha de comando poderia ter. Essa lista é complexa demais para esta resposta curta.

Isaac
fonte
2
Na terminologia POSIX, o que você chama de pipe é uma sequência ou um pipeline (embora um pipeline possa ter uma opção opcional !para negar seu status). pipe prefere se referir ao mecanismo IPC usado pela maioria dos shells para implementar pipelines (os pipelines não precisam usar pipes, o ksh93 usa socketpairs em vez de alguns sistemas, por exemplo). Alguns shells têm mais palavras-chave como time, noglobque podem ser usadas em vez disso ou além !daqui.
Stéphane Chazelas
1
IMHO, essas coisas são chamadas de argumentos - nada mais, então eu acho que a palavra token neste contexto significa "unidade atômica da gramática do bash". Aqui, o termo token existe apenas no contexto da linha de comando do shell , não no contexto do programa executado. Seria um pouco estranho dizer "esses são os tokens dos programas", mas talvez menos estranho dizer "o segundo token na linha de comando é $ test". Uma distinção surge cat $file, aqui eu diria que $fileé um token, mas o valor do arquivo é o argumento.
Att Righ
1
@PeterCordes Você está correto, <<< "…" é um redirecionamento, não um argumento. Embora ainda seja um sinal da linha. Desculpe pela confusão.
Isaac
1
@ TOOGAM São exatamente o oposto das definições padrão. O que o chamador fornece são argumentos; cf. "Parâmetro formal" ou esta questão SO .
Michael Homer
1
@TOOGAM "O que vejo são parâmetros" . Hmm, acho que você está certo. De acordo com a especificação POSIX: "O shell executa uma função (consulte Comando de Definição de Função), interno (consulte Utilitários Internos Especiais), arquivo executável ou script, fornecendo os nomes dos argumentos como parâmetros posicionais numerados de 1 a n, e o nome do comando (ou, no caso de uma função dentro de um script, o nome do script) como o parâmetro posicional numerado 0 (consulte Pesquisa e execução de comandos). " e eu estava errado todos estes anos ... Embora em minha defesa é chamadoargv
Att Righ
15

A resposta de @ isaac acima parece boa.

Eu quero estender isso com algumas fontes.

Eu acho que o padrão POSIX pode, em certo sentido, ser considerado canônico . Outras fontes podem ser man bashe man proc.

┌1┐ ┌──2───┐
git checkout master
│   └──────3──────┘
└───────4─────────┘

O POSIX sugere que:

  1. É o nome do comando (em vez do comando, embora até este documento use o comando em alguns locais)
  2. Argumento
  3. Argumentos
  4. Comando (embora man procuse a linha de comando )

Também possui terminologia para muitos comandos mais complicados.

Eu acho que o comando é bastante ambíguo, então talvez o termo nome do comando e a linha de comando sejam bons para maior clareza.j

Att Righ
fonte
O que é proc? Eu nunca ouvi falar disso.
theonlygusti
5
+1 Gosto mais desta resposta. (Nesse contexto específico, 2 é um subcomando , mas geralmente sim, um argumento).
kubanczyk
O @theonlygusti procé um sistema de arquivos para fins especiais (coleção de arquivos) que fornece informações sobre o estado interno do kernel. Eu acredito que significa processos (veja também sysfs que fornece informações sobre outras coisas além de processos). A razão pela qual é relevante é escrita pelos desenvolvedores do kernel , portanto, pode refletir a linguagem que eles usam, que pode ser um pouco mais formal.
Att Righ