terminología de línea de comando: ¿cómo se llaman estas partes de un comando?

21

En la línea de comando a menudo uso comandos "simples" como

mv foo/bar baz/bar

pero no sé cómo llamar a todas las partes de esto:

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

(Creo que sé) que 1 es un comando y 2 es un argumento, y probablemente llamaría a 3 una lista de argumentos (¿es correcto?).

Sin embargo, no sé cómo llamar 4 .

¿Cómo se etiquetan los "comandos" más complejos?

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

Agradecería una respuesta que desglosa qué llamar 1,2,3,4 y cómo llamar a cada parte de, por ejemplo, este "comando" anterior.

Sería genial aprender también sobre otras cosas que son únicas / sorprendentes que no he incluido aquí.

theonlygusti
fuente
1
¿Has mirado las manpáginas gity find, en particular, la sección de sinopsis?
fpmurphy
44
¿Has mirado en las páginas del manual de Git y encontrar lo que la pregunta parece nada que ver con gito findterminología bastante general para Linux.
Att Righ
De acuerdo con la página de manual de bash en A | B, A | Bes una tubería , Ay Bson comandos (lo lamentable es que esto tiene el mismo nombre que sólo el primer mundo en un comando). Podría llamar al primer argumento ejecutable, pero no puedo encontrar una fuente que esté de acuerdo conmigo.
Att Righ
44
En el contexto de git checkout ..., checkoutes un subcomando , y en el contexto de sh -c ..., -ces una opción .
wjandrea
@JoL gracias por señalar eso. Adivinaste bien, lo he editado. Es porque reescribí esa sección unas 4 veces mientras intentaba hacerlo correctamente
theonlygusti

Respuestas:

33

Los nombres comunes para cada parte son los siguientes:

┌1┐ ┌──2───┐
git checkout master
│   └──────3──────┘
└───────4─────────┘
  1. Nombre del comando (primera palabra o token de la línea de comando que no es una redirección o asignación de variable y después de que se hayan expandido los alias).

  2. Token, palabra o argumento del comando. De man bash:

    palabra: una secuencia de caracteres considerados como una sola unidad por el shell. También conocido como token.

  3. Generalmente: argumentos

  4. Línea de comando.

La concatenación de dos comandos simples con a |es una secuencia de tubería o tubería:

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

Tenga en cuenta que también hay redirecciones y asignaciones variables:

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

Donde (al lado de los números de arriba):

  1. redireccionamiento.
  2. Asignación variable.
  3. Comando simple

Esta no es una lista exhaustiva de todos los elementos que podría tener una línea de comando. Dicha lista es demasiado compleja para esta breve respuesta.

Isaac
fuente
2
En la terminología POSIX, lo que llama tubería es una secuencia de tubería o tubería (aunque una tubería puede tener una guía opcional !para negar su estado). pipe preferiría referirse al mecanismo de IPC utilizado por la mayoría de los shells para implementar tuberías (las tuberías no tienen que usar tuberías, ksh93 usa pares de enchufes en algunos sistemas, por ejemplo). Algunos shells tienen más palabras clave como time, noglobque se pueden usar en su lugar o además de !aquí.
Stéphane Chazelas
1
En mi humilde opinión, estas cosas se llaman argumentos, nada más, así que creo que la palabra token en este contexto significa "unidad atómica de la gramática de bash". Aquí el término token solo existe en el contexto de la línea de comandos de shell , no en el contexto de las ejecuciones del programa. Sería un poco extraño decir "estos son los tokens de los programas", pero quizás sea menos extraño decir "el segundo token en la línea de comando es $ test". Aparece una distinción cat $file, aquí diría que $filees un token, pero el valor del archivo es el argumento.
Att Righ
1
@PeterCordes Tienes razón, <<< "..." es una redirección, no un argumento. Aunque todavía es una muestra de la línea. Perdón por la confusion.
Isaac
1
@TOOGAM Esos son exactamente opuestos a las definiciones estándar. Las cosas que proporciona la persona que llama son argumentos; cf. "Parámetro formal", o esta pregunta SO .
Michael Homer
1
@TOOGAM "Lo que veo son parámetros" . Hmm, creo que tienes razón. De acuerdo con la especificación POSIX: "El shell ejecuta una función (ver Comando de definición de función), incorporada (ver Utilidades incorporadas especiales), archivo ejecutable o script, dando los nombres de los argumentos como parámetros posicionales numerados del 1 al n, y el nombre del comando (o en el caso de una función dentro de un script, el nombre del script) como el parámetro posicional numerado 0 (ver Búsqueda y Ejecución de Comandos) ". y me había equivocado todos estos años ... Aunque en mi defensa se llamaargv
Att Righ
15

La respuesta de @ isaac anterior parece buena.

Quiero extender esto con algunas fuentes.

Supongo que el estándar POSIX en algún sentido podría considerarse canónico . Otras fuentes pueden ser man bashy man proc.

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

POSIX sugiere que:

  1. Es el nombre del comando (en lugar del comando, aunque incluso este documento usa el comando en algunos lugares)
  2. Argumento
  3. Argumentos
  4. Comando (aunque man procusa la línea de comando )

También tiene terminología para muchos comandos más complicados.

Creo que el comando es bastante ambiguo, por lo que quizás el término nombre del comando y la línea de comando sean buenos para mayor claridad.

Att Righ
fuente
¿Qué es proc? Nunca había escuchado acerca de eso.
theonlygusti
55
+1 Me gusta más esta respuesta. (En este contexto específico, 2 es un subcomando , pero generalmente sí, un argumento).
kubanczyk
@theonlygusti proces un sistema de archivos de propósito especial (colección de archivos) que proporciona información sobre el estado interno del núcleo. Creo que significa procesos (ver también sysfs que proporciona información sobre otras cosas además de los procesos). La razón por la que es relevante está escrita por desarrolladores de kernel , por lo que bien puede reflejar el lenguaje que usan, que podría ser un poco más formal.
Att Righ