La entrega anterior acababa con una pregunta: en dir C:\Windows\System32\*.exe, ¿qué parte es el programa y qué parte es lo que le dices que haga? dir es el programa y todo lo demás son sus argumentos. Los argumentos tienen formas distintas, cada una con sus reglas, y de eso va esta entrega.
Esas formas ya las conoces, porque un comando de VFP como este tiene todas las piezas de una orden de consola:
USE clientes ALIAS cli EXCLUSIVEUSE es lo que se ejecuta, clientes es el dato con el que trabaja, ALIAS cli es una cláusula con su valor y EXCLUSIVE es una cláusula sin valor. Guárdate esas cuatro, porque en la consola se llaman programa, posicional, opción y bandera.
El programa y sus argumentos
Toda orden empieza por el programa. Lo que va detrás, separado por espacios, son los argumentos:
ping -n 2 127.0.0.1| Pieza | Qué es |
|---|---|
ping | el programa |
-n 2 | una opción, -n, con su valor, 2 |
127.0.0.1 | un argumento posicional |
El intérprete (cmd o PowerShell) corta la línea por los espacios, busca el programa y le pasa el resto. A partir de ahí, qué significa cada argumento lo decide el programa. ping sabe que -n va seguido de un número, pero otro programa podría usar -n para otra cosa. Las convenciones de esta entrega las siguen casi todos, aunque no hay nada que les obligue.
Posicionales: importa el orden
Un argumento posicional es un valor suelto, sin nombre delante. El programa sabe qué es por el sitio que ocupa. En ping, el único posicional es la máquina a la que haces ping.
Esto ya lo haces en VFP cada vez que llamas a un programa con parámetros:
DO facturar WITH "B-2026-0042", DATE(), .T.
* y en facturar.prg:
LPARAMETERS tcSerie, tdFecha, tlImprimirfacturar no sabe que "B-2026-0042" es la serie por cómo se llama, sino porque llega el primero. Si cambias el orden, tcSerie recibe una fecha. En la consola pasa lo mismo: copy origen.txt destino.txt y copy destino.txt origen.txt son dos órdenes muy distintas.
Opciones: un nombre y, a veces, un valor
Una opción es un argumento con nombre. Empieza por un guion (o por una barra, ahora vamos con eso) y puede llevar un valor detrás:
ping -n 2 127.0.0.1Aquí -n es el nombre y 2 su valor: cuántas veces hacer ping. La ventaja del nombre es que el orden deja de importar. Esto hace lo mismo:
ping 127.0.0.1 -n 2Es lo que en VFP hace una cláusula: USE clientes ALIAS cli EXCLUSIVE y USE clientes EXCLUSIVE ALIAS cli abren la tabla igual. Los procedimientos y las funciones de VFP, en cambio, no tienen parámetros con nombre: todo va por posición, y por eso a partir del cuarto parámetro nadie se acuerda de cuál era cuál. Las opciones son la forma que tiene la consola de evitar ese problema.
El valor va justo detrás del nombre, y el programa se lo lleva sin mirar qué es. Si se te olvida:
ping -n 127.0.0.1Debe especificar la dirección IP.ping ha tomado 127.0.0.1 como el número de veces, y luego se ha encontrado sin dirección. No hay nada roto: ha hecho lo que le has dicho.
Banderas: opciones sin valor
Algunas opciones no llevan valor. Están o no están, como EXCLUSIVE. Se llaman banderas (en inglés, flags) y sirven para encender un comportamiento:
dir /b/b le dice a dir que saque solo los nombres, sin fechas ni tamaños. Sin /b, la lista completa de siempre.
Barra o guion, corto o largo
Te habrás fijado en que dir usa /b y ping usa -n. Es historia de Windows: los programas que vienen del MS-DOS usan la barra, y casi todos los demás (los que vienen de Unix, y casi cualquier herramienta moderna) usan el guion. RUN /N de VFP es de la familia de la barra. ping acepta las dos, así que ping /n 2 127.0.0.1 también funciona, pero no cuentes con que todos lo hagan.
Con guion, además, hay dos formas:
- Corta: un guion y una letra,
-n. - Larga: dos guiones y una palabra,
--max-count.
Muchos programas tienen las dos para la misma opción: la corta para escribir rápido y la larga para que se entienda al leerla dentro de un script. Con git, por ejemplo, estas tres órdenes piden lo mismo, el último cambio del historial:
git log --oneline -n 1
git log --oneline --max-count=1
git log --oneline --max-count 109f72ae Clientes: altasEl valor de una opción larga puede ir pegado con = o separado por un espacio. --oneline es una bandera larga: saca cada cambio en una línea.
Comandos: un programa con varios trabajos
ping hace una sola cosa. git hace decenas: ver el historial, guardar cambios, bajar los de otro. Para eso usa comandos (también se llaman subcomandos o verbos): la primera palabra después del programa dice qué trabajo quieres.
git log
git status
git commit -m "Clientes: altas"Si lo piensas como un foxero, git es una clase y log, status y commit son sus métodos. Cada comando tiene sus propias opciones, como cada método tiene sus parámetros: -m en git commit es el mensaje del cambio, y en git log significa otra cosa.
Si escribes un comando que no existe, el programa te lo dice:
git estadogit: 'estado' is not a git command. See 'git --help'.Y lo mismo con una opción mal escrita: git log --onelin responde fatal: unrecognized argument: --onelin y no hace nada. Un programa de consola bien hecho prefiere negarse a adivinar qué querías decir.
Comillas: los espacios parten
El intérprete corta la línea por los espacios, así que un nombre con espacios llega partido. Prueba esto en una carpeta de pruebas:
mkdir Mis Datos
dir /bDatos
Mismkdir ha recibido dos argumentos y ha creado dos carpetas. Con comillas, el intérprete entiende que es uno solo:
mkdir "Mis Datos"Mis DatosEn VFP te pasa lo mismo con cualquier ruta que tenga espacios: DO C:\Mis programas\ventas.prg responde Syntax error y DO "C:\Mis programas\ventas.prg" funciona. VFP también corta por el espacio. Y con RUN, igual: si la ruta del programa o de un fichero lleva espacios, va entre comillas dentro de la orden.
El doble guion: aquí se acaban las opciones
Queda una pieza que se ve poco. Dos guiones solos, --, separados de todo, quieren decir «lo que viene detrás no son opciones, aunque empiecen por guion».
Hace falta cuando un posicional parece una opción. Imagina un fichero que se llama -n (raro, pero los hay). Si le pides a git su historial, lo confunde con la opción -n:
git log --oneline -nerror: -n requires an argumentCon el doble guion delante, git sabe que -n es un fichero:
git log --oneline -- -nef3e1a1 Fichero con nombre raroEn git se usa también para dejar claro que lo que sigue son ficheros: git log --oneline -- clientes.prg enseña solo los cambios que tocaron ese fichero.
Para practicar
Abre un cmd, crea una carpeta de pruebas y entra en ella:
mkdir C:\pruebas-cli
cd C:\pruebas-cliLuego, para cada orden, di cuál es el programa, cuáles son las opciones (con valor o banderas) y cuáles los posicionales. Después ejecútala:
ping -n 1 127.0.0.1
ping 127.0.0.1 -n 1
ping -n 127.0.0.1
mkdir Mis Datos
mkdir "Mis Datos 2"
dir /b
dir /b /ad C:\WindowsLa última tiene dos banderas (/b y /ad, que pide solo carpetas) y un posicional. En el mío saca 88 carpetas.
Si escribes ping sin nada, te enseña cómo se usa:
Uso: ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-v TOS]
[-r count] [-s count] [[-j host-list] | [-k host-list]]
[-w timeout] [-R] [-S srcaddr] [-c compartment] [-p]Con lo que has visto hoy ya puedes leer casi toda esa línea: opciones cortas, unas con valor (-n count) y otras sin él (-t). Los corchetes y la barra vertical tienen su propio significado, y leer una ayuda como esta es lo que toca en la entrega 4. Antes, en la 3, lo que un programa de consola escribe y dónde lo escribe.